Udostępnij za pośrednictwem


CA2216: Typy usuwalne powinny deklarować finalizator

TypeName

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

Kategoria

Microsoft.Usage

Zmiana kluczowa

Niekluczowa

Przyczyna

Typ, który implementuje 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łaj GC.KeepAlive gdy używasz zasobów natywnych

CA1816: Wywołaj poprawnie GC.SuppressFinalize

CA1049: Typy, które posiadają natywne zasoby powinny być usuwalne

Zobacz też

Informacje

IDisposable

IntPtr

HandleRef

UIntPtr

Object.Finalize

Inne zasoby

Implementing Finalize and Dispose