Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| Tulajdonság | Érték |
|---|---|
| Szabályazonosító | CA1816 |
| Cím | A GC.SuppressFinalize helyes meghívása |
| Kategória | Használat |
| A javítás romboló vagy nem romboló | Nem törhető |
| Alapértelmezés szerint engedélyezve a .NET 10-ben | Javaslatként |
| Alkalmazandó nyelvek | C# és Visual Basic |
Ok
A szabály megsértését a következő okozhatja:
A rendezetlen osztályban az a metódus, amelyik implementációja IDisposable.Dispose, és nem hívja meg GC.SuppressFinalize.
Olyan metódus, amely nem a IDisposable.Dispose implementációja, és meghívja a GC.SuppressFinalize metódust.
Egy metódus, amely meghívja a GC.SuppressFinalize elemet, és olyasmit ad át, ami nem a this (C#) vagy Me (Visual Basic).
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ípusoknak ne kelljen újraimplementálniuk IDisposable és meghívniuk azt, azokat a véglegesítők nélküli, nem lezárt típusokat is meg 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 egy Dispose implementációja, adjon hozzá egy hívást GC.SuppressFinalize.
Ha a metódus nem a Dispose implementációja, távolítsa el a GC.SuppressFinalize hívást, vagy helyezze át a típus Dispose implementációjára.
Módosítsa az GC.SuppressFinalize összes hívását a this (C#) vagy a Me (Visual Basic) átadására.
Ha a típust nincs szándékában felülírni, jelölje meg
sealed-ként.
Mikor kell letiltani a figyelmeztetéseket?
Csak akkor nyomja el a szabály által adott figyelmeztetést, ha szándékosan más objektumok élettartamának szabályozására használja a GC.SuppressFinalize. Ne nyomja el ennek a szabálynak a figyelmeztetését, ha egy implementáció Dispose nem hívja meg a 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 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;
}
}
}
A CA1816-nak megfelelő példa
Ez a példa egy olyan metódust mutat be, amely helyesen hívja meg ezt a GC.SuppressFinalize, átadva a this (C#) vagy a Me (Visual Basic).
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;
}
}
}
Kapcsolódó szabályok
- CA2215: A Dispose metódusoknak az alaposztály Dispose hívását kell végezniük
- CA2216: Az eldobható típusoknak véglegesítőt kell deklarálniuk