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

Vlastnost Hodnota
ID pravidla CA2216
Název Uvolnitelné typy by měly deklarovat finalizační metodu
Kategorie Využití
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Typ, který implementuje System.IDisposablea má pole, která navrhují použití nespravovaných prostředků, neimplementuje finalizátor, jak je popsáno .System.Object.Finalize

Popis pravidla

Porušení tohoto pravidla je hlášeno, pokud uvolnitelný typ obsahuje pole následujících typů:

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, implementujte finalizátor, který volá vaši Dispose metodu.

Kdy potlačit upozornění

Pokud typ neimplementuje IDisposable pro účely uvolnění nespravovaných prostředků, je bezpečné potlačit upozornění z tohoto pravidla.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

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

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: Volejte správně GC.SuppressFinalize

Viz také