CA2221:终结器应该受到保护
本文关键字:保护 CA2221 | 更新日期: 2023-09-27 18:25:22
我看了这个规则,它说Finalizer应该受到保护,我们应该向Finalizer添加受保护的修饰符。
我完全困惑了,因为我很确定我不能修改析构函数以拥有受保护的修饰符。
如果这是编译器自动处理的事情,当它没有被明显提及时,并且规则的修复程序明确指出用protected关键字修改Finalizer(没有意义)。
因为Object类中的Finalize方法是由析构函数自动调用的,所以我不能用任何修饰符修改Finalizer,这一说法正确吗?
CA2220也有同样的问题:终结器应该调用基类终结器这说明我应该从派生类调用基本Finalizer,但据我所知,基本Finalizers是在Object类的Finalize方法中自动调用的,我甚至不必为此烦恼。我说得对吗?
这个规则不应该应用于您编写的任何C#代码。终结器的访问修饰符由编译器控制,并且它被正确地作为受保护的发出。只有自身发出IL的程序才能违反此规则。MSDN页面的备注部分对此进行了说明
- CA221 MSDN页
备注
在任何高级.NET语言中都不能违反此规则;如果您正在编写Microsoft中间语言,则可能会违反此规则。
同样的基本逻辑也适用于CA2220。C#编译器将自动插入对基终结器的调用,并且没有办法停止这种调用。然而,也有其他语言,如VB.Net,不这样做,CA2220也适用于它们。
- CA2220 MSDN页面
注意:如果您试图验证我所说的反射器中的C#终结器,请确保查看IL,而不是已分解的代码。反射器将在反编译的代码视图中隐藏基本终结器调用,但不隐藏IL