CA1816: GC hívása. A megfelelő elnyomásifinalizálás
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1816 |
Cím | GC hívása. A megfelelő elnyomásifinalizálás |
Kategória | Használat |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Javaslatként |
Ok
A szabály megsértését a következő okozhatja:
A rendezetlen osztályban az a metódus, amely implementációja IDisposable.Dispose , és nem hívja meg a metódust GC.SuppressFinalize.
Olyan metódus, amely nem implementációja és hívása IDisposable.DisposeGC.SuppressFinalize.
Egy metódus, amely nem ezt (C#) vagy Engem (Visual Basic) hívja GC.SuppressFinalize meg és adja át.
Szabály leírása
Ezzel a IDisposable.Dispose módszerrel a felhasználók bármikor felszabadíthatják az erőforrásokat, mielőtt az objektum elérhetővé válik a szemétgyűjtéshez. Ha a IDisposable.Dispose metódust meghívják, felszabadítja az objektum erőforrásait. Ez szükségtelené teszi a véglegesítést. IDisposable.Dispose hívja meg GC.SuppressFinalize , hogy a szemétgyűjtő ne hívja meg az objektum véglegesítőjét.
Annak érdekében, hogy a véglegesítőkkel rendelkező származtatott típusok ne legyenek újrakonfigurálva IDisposable és meghívva, a véglegesítők nélküli, el nem helyezett típusoknak továbbra is fel kell hívniuk GC.SuppressFinalize.
Szabálysértések kijavítása
A szabály megsértésének kijavítása:
Ha a metódus implementációja Dispose, adjon hozzá egy hívást a következőhöz GC.SuppressFinalize: .
Ha a metódus nem implementációja Dispose, távolítsa el a hívást GC.SuppressFinalize , vagy helyezze át a típus implementációjára Dispose .
Módosítsa az GC.SuppressFinalize összes hívást a (C#) vagy a Me (Visual Basic) átadására.
Ha a típust nem felül kell bírálni, jelölje meg a következőként
sealed
: .
Mikor kell letiltani a figyelmeztetéseket?
Csak akkor tiltsa el a szabály figyelmeztetését, ha szándékosan más objektumok élettartamának szabályozására használja GC.SuppressFinalize . Ne tiltsa el a szabály figyelmeztetését, ha egy implementáció Dispose nem hív meg GC.SuppressFinalize. Ebben az esetben a véglegesítés mellőzése rontja a teljesítményt, és nem jár előnyökkel.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA1816
// The code that's violating the rule is on this line.
#pragma warning restore CA1816
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none
a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA1816.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
A CA1816-ot sértő példa
Ez a kód egy metódust jelenít meg, amely meghívja GC.SuppressFinalize, de nem adja át ezt (C#) vagy Én (Visual Basic). Ennek eredményeként ez a kód megsérti a CA1816 szabályt.
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;
}
}
}
}
A CA1816-nak megfelelő példa
Ez a példa egy olyan metódust mutat be, amely helyesen hívja GC.SuppressFinalize meg ezt a (C#) vagy Az én (Visual Basic) parancsot.
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;
}
}
}
}
Kapcsolódó szabályok
- CA2215: Az elidegenítési módszereknek alaposztály-elidegenítést kell hívniuk
- CA2216: Az eldobható típusoknak véglegesítőt kell deklarálniuk
Kapcsolódó információk
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: