CA2216:可處置型別應該宣告完成項
型別名稱 |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
分類 |
Microsoft.Usage |
中斷變更 |
不中斷 |
原因
實作 System.IDisposable 且具有建議 Unmanaged 資源用法之欄位的型別,未實作如 Object.Finalize 所述的完成項。
規則描述
如果可處置型別包含下列型別的欄位,就會報告違反此規則:
如何修正違規
若要修正此規則的違規情形,請實作會呼叫 Dispose 方法的完成項。
隱藏警告的時機
如果該型別並未實作 IDisposable 以達到釋放 Unmanaged 資源的目的,則您可以放心地隱藏這項規則的警告。
範例
下列範例顯示違反此規則的型別。
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);
// }
}
}
相關規則
CA2115:使用原生資源時必須呼叫 GC.KeepAlive
CA1816:正確呼叫 GC.SuppressFinalize
請參閱
參考
實作 Finalize 和 Dispose 以清除 Unmanaged 資源