次の方法で共有


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: ネイティブ リソースを所有する型は、破棄可能でなければなりません

参照

関連項目

Implementing Finalize and Dispose

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize