CA1816: Hívja meg a GC.SuppressFinalize módszert helyesen a finalizálás helyes elnyomásához.

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:

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:

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;
        }
    }
}

Lásd még