通过


CA2015:请勿为派生自 MemoryManager<T> 的类型定义析构函数

属性
规则 ID CA2015
标题 请勿为派生自 MemoryManager<T> 的类型定义终结器
类别 可靠性
修复是导致破坏性更改还是非破坏性更改 非中断
在 .NET 10 中默认启用 作为警告
适用的语言 C# 和 Visual Basic

原因

为派生自 MemoryManager<T> 的类型定义终结器

规则说明

将终结器添加到派生自 MemoryManager<T> 的类型很可能表示存在 bug,因为这表明在 Span<T> 中交付的本机资源被清理,而此时 Span<T> 可能仍在使用该资源。

注意

MemoryManager<T> 类适用于高级方案。 大多数开发人员不需要使用它。

如何解决违规

若要修复此违规,请删除终结器定义。

class DerivedClass <T> : MemoryManager<T>
{
    public override bool Dispose(bool disposing)
    {
        if (disposing)
        {
            _handle.Dispose();
        }
    }

    ...

    // Violation occurs, remove the finalizer to fix the warning.
    ~DerivedClass() => Dispose(false);
}

何时禁止显示警告

如果您的目的是为了调试或验证而创建终结器,那么抑制该规则的违规行为是安全的。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA2015
// The code that's violating the rule is on this line.
#pragma warning restore CA2015

若要对文件、文件夹或项目禁用该规则,请在none中将其严重性设置为

[*.{cs,vb}]
dotnet_diagnostic.CA2015.severity = none

若要禁用此整个规则类别,请在配置文件中将此类别的严重性设置为none

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

另请参阅