2

我在看这条规则,它说终结器应该受到保护,我们应该向终结器添加受保护的修饰符。

我很困惑,因为我很确定我不能将析构函数修改为具有受保护的修饰符。

如果这是编译器自动处理的事情,那么当它没有被明显提及并且规则的修复明确指出用受保护的关键字修改终结器时(没有意义)。

我是否正确地说我不能用任何修饰符修改终结器,因为 Object 类中的 Finalize 方法是由析构函数自动调用的?

CA2220的相同问题:终结器应该调用基类终结器 这说我应该从派生类调用基终结器,但据我所知,基终结器会在 Object 类的 Finalize 方法中自动调用,我什至不必费心那。我对吗?

4

1 回答 1

8

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

评论

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

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

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

于 2013-07-29T23:38:16.090 回答