Share via


CA1816: Bel GC. SuppressFinalize correct

Eigenschappen Weergegeven als
Regel-id CA1816
Titel Bel GC. SuppressFinalize correct
Categorie Gebruik
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Als suggestie

Oorzaak

Schendingen van deze regel kunnen worden veroorzaakt door:

Beschrijving van regel

Met de IDisposable.Dispose methode kunnen gebruikers op elk gewenst moment resources vrijgeven voordat het object beschikbaar wordt voor garbagecollection. Als de IDisposable.Dispose methode wordt aangeroepen, worden resources van het object vrijgemaakt. Dit maakt het voltooien onnodig. IDisposable.Dispose moet worden aangeroepen GC.SuppressFinalize zodat de garbagecollector de finalizer van het object niet aanroept.

Om te voorkomen dat afgeleide typen met finalizers opnieuw moeten worden hersteld IDisposable en aangeroepen, moeten niet-verzegelde typen zonder finalizers nog steeds worden aangeroepen GC.SuppressFinalize.

Schendingen oplossen

Een schending van deze regel oplossen:

Wanneer waarschuwingen onderdrukken

Alleen een waarschuwing van deze regel onderdrukken als u bewust de GC.SuppressFinalize levensduur van andere objecten beheert. Onderdrukt geen waarschuwing van deze regel als een implementatie van Dispose deze regel niet wordt aangeroepen GC.SuppressFinalize. In deze situatie worden de prestaties verminderd en biedt het niet mogelijk om de voltooien te onderdrukken en biedt dit geen voordelen.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Voorbeeld dat CA1816 schendt

Deze code toont een methode die aanroeptGC.SuppressFinalize, maar deze (C#) of Mij (Visual Basic) niet doorgeeft. Als gevolg hiervan schendt deze code regel CA1816.

Public Class DatabaseConnector
    Implements IDisposable

    Private _Connection As New SqlConnection

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        ' Violates rules
        GC.SuppressFinalize(True)
    End Sub

    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If _Connection IsNot Nothing Then
                _Connection.Dispose()
                _Connection = Nothing
            End If
        End If
    End Sub

End Class
public class DatabaseConnector : IDisposable
{
    private SqlConnection? _Connection = new SqlConnection();

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(true);  // Violates rule
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_Connection != null)
            {
                _Connection.Dispose();
                _Connection = null;
            }
        }
    }
}

Voorbeeld dat voldoet aan CA1816

In dit voorbeeld ziet u een methode die correct wordt aangeroepen GC.SuppressFinalize door deze (C#) of Mij (Visual Basic) door te geven.

Public Class DatabaseConnector
    Implements IDisposable

    Private _Connection As New SqlConnection

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub

    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If _Connection IsNot Nothing Then
                _Connection.Dispose()
                _Connection = Nothing
            End If
        End If
    End Sub

End Class
public class DatabaseConnector : IDisposable
{
    private SqlConnection? _Connection = new SqlConnection();

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_Connection != null)
            {
                _Connection.Dispose();
                _Connection = null;
            }
        }
    }
}

Zie ook