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 9 | Sebagai saran |
Penyebab
Pelanggaran aturan ini dapat disebabkan oleh:
Dalam kelas yang tidak disegel, metode yang merupakan implementasi dari IDisposable.Dispose dan tidak memanggil GC.SuppressFinalize.
Metode yang bukan implementasi IDisposable.Dispose dan memanggil GC.SuppressFinalize.
Metode yang memanggil GC.SuppressFinalize dan meneruskan sesuatu selain ini (C#) atau Saya (Visual Basic).
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:
Jika metode adalah implementasi dari Dispose, tambahkan panggilan ke GC.SuppressFinalize.
Jika metode bukan implementasi , Disposehapus panggilan ke GC.SuppressFinalize atau pindahkan ke implementasi jenis Dispose .
Ubah semua panggilan untuk GC.SuppressFinalize meneruskan ini (C#) atau Saya (Visual Basic).
Jika jenis tidak dimaksudkan untuk ditimpa, tandai sebagai
sealed
.
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;
}
}
}
}
Aturan terkait
- CA2215: Metode Buang harus memanggil pembuangan kelas dasar
- CA2216: Jenis sekali pakai harus mendeklarasikan finalis