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 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 Mij (Visual Basic) wordt aangeroepen GC.SuppressFinalize en doorgegeven.
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:
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 Mij (Visual Basic) door te GC.SuppressFinalize 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 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;
}
}
}
}
Gerelateerde regels
- CA2215: Verwijderingsmethoden moeten de basisklasse verwijderen aanroepen
- CA2216: Wegwerptypen moeten finalizer declareren