Udostępnij za pośrednictwem


CA2216: Typy usuwalne powinny deklarować finalizator

Właściwości Wartość
Identyfikator reguły CA2216
Tytuł Typy możliwe do likwidacji powinny deklarować finalizator
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

Typ implementujący System.IDisposableelement i zawiera pola sugerujące użycie niezarządzanych zasobów, nie implementuje finalizatora zgodnie z opisem w temacie System.Object.Finalize.

Opis reguły

Naruszenie tej reguły jest zgłaszane, jeśli typ jednorazowy zawiera pola następujących typów:

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, zaimplementuj finalizator, który wywołuje metodę Dispose .

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli typ nie jest implementowany IDisposable w celu zwolnienia niezarządzanych zasobów.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład

W poniższym przykładzie pokazano typ naruszający tę regułę.

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

CA1816: Wywołaj poprawnie metodę GC.SuppressFinalize

Zobacz też