Megosztás a következőn keresztül:


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:

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:

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ó információk