Sdílet prostřednictvím


CA2216: Uvolnitelné typy by měly deklarovat finalizační metodu

TypeName

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

Kategorie

Microsoft.Usage

Narušující změna

Nenarušující

Příčina

Typ, který implementuje IDisposable a obsahuje pole, která navrhují použití nespravovaných zdrojů prostředky neimplementuje finalizační metodu jak je popsáno v Object.Finalize.

Popis pravidla

Porušení tohoto pravidla je oznámeno, pokud jednorázový typ obsahuje následující typy polí:

Jak vyřešit porušení

Porušení tohoto pravidla lze vyřešit implementací finalizační metody, která volá metodu Dispose.

Kdy potlačit upozornění

Je bezpečné potlačit upozornění tohoto pravidla, pokud typ za účelem uvolnění nespravovaných prostředků neimplementuje IDisposable.

Příklad

Následující příklad ukazuje typ, který porušuje toto pravidlo.

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); 
        // }
    }
}

Související pravidla

CA2115: Volejte GC.KeepAlive při použití nativních zdrojů

CA1816: Volejte správně GC.SuppressFinalize

CA1049: Typy, které vlastní nativní prostředky by měly být uvolnitelné

Viz také

Referenční dokumentace

IDisposable

IntPtr

HandleRef

UIntPtr

Object.Finalize

Další zdroje

Implementing Finalize and Dispose