Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| 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 9 | Als suggestie | 
Oorzaak
Schendingen van deze regel kunnen worden veroorzaakt door:
In een niet-verzegelde klasse wordt een methode die een implementatie is van IDisposable.Dispose en die niet aanroept GC.SuppressFinalize.
Een methode die geen implementatie is van IDisposable.Dispose en aanroept GC.SuppressFinalize.
Een methode waarmee iets anders dan deze (C#) of GC.SuppressFinalize) wordt aangeroepen en doorgegeven.
Beschrijving van regel
Met de IDisposable.Dispose methode kunnen gebruikers op elk gewenst moment resources vrijgeven voordat het object beschikbaar komt 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:
Als de methode een implementatie is van Dispose, voegt u een aanroep toe aan GC.SuppressFinalize.
Als de methode geen implementatie is, Disposeverwijdert u de aanroep naar GC.SuppressFinalize of verplaatst u deze naar de implementatie van Dispose het type.
Wijzig alle aanroepen om deze (C#) of GC.SuppressFinalize door te geven.
Als het type niet is bedoeld om te worden overschreven, markeert u het als
sealed.
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 MyStreamClass
    Implements IDisposable
    Private _stream As New MemoryStream
    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        ' Violates rule.
        GC.SuppressFinalize(True)
    End Sub
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If _stream IsNot Nothing Then
                _stream.Dispose()
                _stream = Nothing
            End If
        End If
    End Sub
End Class
public class MyStreamClass : IDisposable
{
    private MemoryStream? _stream = new();
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(true);  // Violates rule
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            _stream?.Dispose();
            _stream = 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 MyStreamClass
    Implements IDisposable
    Private _stream As New MemoryStream
    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 _stream IsNot Nothing Then
                _stream.Dispose()
                _stream = Nothing
            End If
        End If
    End Sub
End Class
public class MyStreamClass : IDisposable
{
    private MemoryStream? _stream = new();
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            _stream?.Dispose();
            _stream = null;
        }
    }
}
Gerelateerde regels
- CA2215: Verwijderingsmethoden moeten de basisklasse verwijderen aanroepen
 - CA2216: Wegwerptypen moeten finalizer declareren