Udostępnij za pośrednictwem


CA2216: Typy jednorazowych należy zadeklarować finalizatorów

TypeName

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ, który implementuje System.IDisposable i zawiera pola, które sugerują wykorzystania zasobów niezarządzanych, nie implementuje finalizatora jako opisano w Object.Finalize.

Opis reguły

Naruszenie tej zasady jest raportowane, jeśli typ usuwalny zawiera pola następujących typów:

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy zaimplementować finalizator, który wywołują metodę Dispose.

Kiedy pomijać ostrzeżenia

Można pominąć ostrzeżenia od tej reguły, jeśli typ nie implementuje IDisposable do zwalniania niezarządzanych zasobów.

Przykład

Poniższy przykład pokazuje typ, który narusza regułę.

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

Powiązane reguły

CA2115: Wywołanie GC.Utrzymywania aktywności podczas korzystania z zasobów macierzystych

CA1816: Wywołanie GC.SuppressFinalize poprawnie

CA1049: Typy, które macierzystych środków własnych powinna być jednorazowe

Zobacz też

Informacje

Implementing Finalize and Dispose

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize