CA2216:可释放类型应声明终结器
属性 | 值 |
---|---|
规则 ID | CA2216 |
标题 | 可释放类型应声明终结器 |
类别 | 使用情况 |
修复是中断修复还是非中断修复 | 非中断 |
在 .NET 9 中默认启用 | 否 |
原因
实现 System.IDisposable 且包含指示使用非托管资源的字段的类型不实现 System.Object.Finalize 所描述的终结器。
规则说明
如果可释放类型包含以下类型的字段,则会发生与此规则的冲突:
如何解决冲突
若要解决与此规则的冲突,请实现调用 Dispose 方法的终结器。
何时禁止显示警告
如果该类型不实现 IDisposable 以释放非托管资源,则可以安全地禁止显示此规则的警告。
抑制警告
如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。
#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none
。
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
有关详细信息,请参阅如何禁止显示代码分析警告。
示例
下面的示例演示了与此规则冲突的类型。
public class DisposeMissingFinalize : IDisposable
{
private bool disposed = false;
private IntPtr unmanagedResource;
[DllImport("native.dll")]
private static extern IntPtr AllocateUnmanagedResource();
[DllImport("native.dll")]
private static extern void FreeUnmanagedResource(IntPtr p);
DisposeMissingFinalize()
{
unmanagedResource = AllocateUnmanagedResource();
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
FreeUnmanagedResource(unmanagedResource);
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
Dispose(true);
}
// Disposable types with unmanaged resources implement a finalizer.
// Uncomment the following code to satisfy rule:
// DisposableTypesShouldDeclareFinalizer
// ~TypeA()
// {
// Dispose(false);
// }
}
相关规则
CA1816:正确调用 GC.SuppressFinalize