2013-07-29 25 views
2

我在看這個規則,它說終結器應該受到保護,我們應該向受保護的終結器添加受保護的修飾符。CA2221:終結器應該受到保護

我完全困惑,因爲我非常確定我無法修改析構函數以使其具有受保護的修飾符。

如果這是編譯器自動處理的東西,當它沒有明顯提及時,規則的修復清楚地指出使用protected關鍵字修改Finalizer(沒有意義)。

我正確地說我無法修改任何修飾符的Finalizer,因爲Object類中的Finalize方法是由析構函數自動調用的嗎?

同樣的問題CA2220:終結器應調用基類的終結 這是說我應該從派生類中調用基終結,但據我讀,基地終結於Object類,我不要的定案方法被自動調用甚至不必爲此煩惱。 我對不對?

+0

什麼規則?什麼是CA2221? – Hogan

+0

@Hogan http://msdn.microsoft.com/en-us/library/ms182340.aspx - 另外,'protected〜Foo()'編譯得很好。 – aevitas

+0

@inspiringmyself你真的在自己的代碼中看到這些違規行爲嗎?還是隻是瀏覽整個代碼分析規則集? –

回答

8

此規則不適用於您編寫的任何C#代碼。終結器的訪問修飾符由編譯器控制,並在受保護時正確發出。只有本身發射IL的節目才能違反這條規則。這是在MSDN頁面上的備註欄指出

備註

這條規則不能在任何高級.NET語言侵犯;如果您正在編寫Microsoft中間語言,則可能會觸犯它。

相同的基本邏輯適用於CA2220。 C#編譯器會自動將調用插入到基本終結器中,並且無法停止該調用。然而,還有其他語言,如VB.Net,不這樣做,CA2220適用於它們。

注意:如果你正試圖驗證我說過在反射器C#終結,一定要看看IL不是反彙編代碼。 Reflector會在反編譯的代碼視圖中隱藏基礎終結器調用,但不包含IL

+0

CA2220規則如何?我正確地說編譯器會自動處理它嗎? – inspiringmyself

+0

@inspiringmyself我剛剛更新了我的答案,包括這一點。必須做一些實驗,然後我才能舒適地回答這個問題 – JaredPar

+0

非常感謝您的快速響應! – inspiringmyself