Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA1816 |
| Judul | Panggil GC.SuppressFinalize dengan benar |
| Kategori | Penggunaan |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Sebagai saran |
| Bahasa yang berlaku | C# dan Visual Basic |
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 tidak merupakan implementasi IDisposable.Dispose serta 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 supaya pengumpul sampah tidak memanggil finalizer dari objek tersebut.
Untuk mencegah tipe turunan dengan finalizer harus mengulang penerapan IDisposable dan memanggilnya, tipe yang tidak disegel tanpa finalizer tetap harus 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 dari Dispose, hapus panggilan ke GC.SuppressFinalize atau pindahkan ke implementasi tipe Dispose.
Ubah semua panggilan ke GC.SuppressFinalize untuk mengoper this (C#) atau Me (Visual Basic).
Jika tipe tidak dimaksudkan untuk digantikan, tandai sebagai
sealed.
Kapan harus menekan peringatan
Abaikan peringatan dari aturan ini hanya 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 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;
}
}
}
Contoh yang memenuhi CA1816
Contoh ini memperlihatkan metode yang memanggil GC.SuppressFinalize dengan benar dengan meneruskan ini (C#) atau Saya (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;
}
}
}
Aturan terkait
- CA2215: Metode Dispose harus memanggil metode dispose kelas dasar
- CA2216: Jenis sekali pakai harus menetapkan finalisasi