CA2221:应该保护终结器

时间:2013-07-29 23:31:58

标签: c# c#-4.0 idisposable

我正在查看此规则,并说它应该受到保护,我们应该将保护修饰符添加到Finalizer。

我很困惑,因为我很确定我无法修改析构函数以获得受保护的修饰符。

如果这是编译器自动处理的内容,当它没有明显提及时,并且规则的修复明确指出使用protected关键字修改Finalizer(没有意义)。

我是否正确地说我无法使用任何修饰符修改Finalizer,因为Object类中的Finalize方法会被析构函数自动调用?

CA2220相同的问题:终结器应调用基类终结器 这说我应该从派生类调用基本的终结器,但据我所知,基本终结器在Object类的Finalize方法中自动调用,我甚至不必为此烦恼。 我是对的吗?

1 个答案:

答案 0 :(得分:8)

此规则不适用于您编写的任何C#代码。终结器的访问修饰符由编译器控制,并且在受保护时正确发出。只有本身发出IL的程序才会违反此规则。这在MSDN页面的备注部分中注明

说明

  

任何高级.NET语言都不能违反此规则;如果您正在编写Microsoft中间语言,则可能会违反。

相同的基本逻辑适用于CA2220。 C#编译器将自动插入对基本终结器的调用,并且无法阻止它。但是还有其他语言,比如VB.Net,它们没有这样做,CA2220适用于它们。

注意:如果您试图验证我在反射器中对C#终结器的说法,请确保查看IL而不是反汇编代码。 Reflector将在反编译代码视图中隐藏基本终结器调用,但不隐藏IL