Bagikan melalui


CA1816: Panggil GC.SuppressFinalize dengan benar

Properti Nilai
ID Aturan CA1816
Judul Hubungi GC SuppressFinalize dengan benar
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Pelanggaran aturan ini dapat disebabkan oleh:

Deskripsi aturan

Metode ini IDisposable.Dispose memungkinkan pengguna merilis sumber daya kapan saja sebelum objek tersedia untuk pengumpulan sampah. Jika metode dipanggil IDisposable.Dispose , metode ini membebaskan sumber daya objek. Ini membuat finalisasi tidak perlu. IDisposable.Dispose harus memanggil GC.SuppressFinalize sehingga pengumpul sampah tidak memanggil finalizer objek.

Untuk mencegah jenis turunan dengan finalizer harus mengisi IDisposable ulang dan memanggilnya, jenis yang tidak disegel tanpa finalizer harus tetap memanggil GC.SuppressFinalize.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini:

Kapan harus menekan peringatan

Hanya tekan peringatan dari aturan ini jika Anda sengaja menggunakan GC.SuppressFinalize untuk mengontrol masa pakai objek lain. Jangan menekan peringatan dari aturan ini jika implementasi Dispose tidak memanggil GC.SuppressFinalize. Dalam situasi ini, gagal menekan finalisasi menurunkan performa dan tidak memberikan manfaat.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

#pragma warning disable CA1816
// The code that's violating the rule is on this line.
#pragma warning restore CA1816

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA1816.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh yang melanggar CA1816

Kode ini menunjukkan metode yang memanggil GC.SuppressFinalize, tetapi tidak meneruskan ini (C#) atau Saya (Visual Basic). Akibatnya, kode ini melanggar aturan 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;
            }
        }
    }
}

Contoh yang memenuhi CA1816

Contoh ini memperlihatkan metode yang memanggil GC.SuppressFinalize dengan benar dengan meneruskan ini (C#) atau Saya (Visual Basic).

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

Baca juga