CA2216:可释放类型应声明终结器
类型名 |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
类别 |
Microsoft.Usage |
是否重大更改 |
否 |
原因
实现 System.IDisposable 并包含建议使用非托管资源的字段的类型未实现 Object.Finalize 所描述的终结器。
规则说明
如果可释放类型包含以下类型的字段,则将报告与该规则的冲突:
如何解决冲突
要修复与该规则的冲突,请实现一个终结器来调用您的 Dispose 方法。
何时禁止显示警告
如果类型没有实现 IDisposable 来释放非托管资源,则可以安全地禁止显示此规则发出的警告。
示例
下面的示例演示一个与该规则冲突的类型。
using System;
using System.Runtime.InteropServices;
namespace UsageLibrary
{
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
请参见
参考
Implementing Finalize and Dispose