CA2216: 破棄できる型ではファイナライザーを宣言します
TypeName |
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);
// }
}
}
関連規則
CA2115: ネイティブ リソースを使用しているときには GC.KeepAlive を呼び出します
CA1816: GC.SuppressFinalize を正しく呼び出します
CA1049: ネイティブ リソースを所有する型は、破棄可能でなければなりません
参照
参照
アンマネージ リソースをクリーンアップするための Finalize および Dispose の実装