CA1821:移除空终结器

属性
规则 ID CA1821
标题 移除空终结器
类别 “性能”
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用 作为建议

原因

类型实现了一个空的终结器,只调用基类型终结器或只调用条件性发出的方法。

规则说明

应尽可能避免终结器,因为跟踪对象生存期会产生额外的性能系统开销。 垃圾回收器在收集对象之前运行终结器。 这意味着收集对象至少需要两个集合。 空的终结器只会徒增开销,没有一点好处。

如何解决冲突

移除空的终结器。 如果调试需要终结器,请将整个终结器置于 #if DEBUG / #endif 指令中。

何时禁止显示警告

不禁止显示此规则发出的消息。

示例

下面的示例演示了应移除的空终结器、应置于 #if DEBUG / #endif 指令中的终结器以及正确使用 #if DEBUG / #endif 指令的终结器。

    public class Class1
    {
        // Violation occurs because the finalizer is empty.
        ~Class1()
        {
        }
    }

    public class Class2
    {
        // Violation occurs because Debug.Fail is a conditional method.
        // The finalizer will contain code only if the DEBUG directive
        // symbol is present at compile time. When the DEBUG
        // directive is not present, the finalizer will still exist, but
        // it will be empty.
        ~Class2()
        {
            Debug.Fail("Finalizer called!");
        }
    }

    public class Class3
    {
#if DEBUG
        // Violation will not occur because the finalizer will exist and
        // contain code when the DEBUG directive is present. When the
        // DEBUG directive is not present, the finalizer will not exist,
        // and therefore not be empty.
        ~Class3()
        {
            Debug.Fail("Finalizer called!");
        }
#endif
    }