CA2216: Jenis sekali pakai harus mendeklarasikan finalis
Properti | Nilai |
---|---|
ID Aturan | CA2216 |
Judul | Jenis sekali pakai harus mendeklarasikan penyelesai |
Golongan | Penggunaan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Jenis yang mengimplementasikan System.IDisposable, dan memiliki bidang yang menyarankan penggunaan sumber daya yang tidak dikelola, tidak menerapkan finalizer seperti yang dijelaskan oleh System.Object.Finalize.
Deskripsi aturan
Pelanggaran aturan ini dilaporkan jika jenis sekali pakai berisi bidang dari jenis berikut:
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, terapkan finalizer yang memanggil metode Anda Dispose .
Kapan harus menekan peringatan
Aman untuk menekan peringatan dari aturan ini jika jenis tidak diterapkan IDisposable untuk tujuan melepaskan sumber daya yang tidak dikelola.
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 CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Contoh
Contoh berikut menunjukkan jenis yang melanggar aturan ini.
public class DisposeMissingFinalize : IDisposable
{
private bool disposed = false;
private IntPtr unmanagedResource;
[DllImport("native.dll")]
private static extern IntPtr AllocateUnmanagedResource();
[DllImport("native.dll")]
private static extern void FreeUnmanagedResource(IntPtr p);
DisposeMissingFinalize()
{
unmanagedResource = AllocateUnmanagedResource();
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
FreeUnmanagedResource(unmanagedResource);
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
Dispose(true);
}
// Disposable types with unmanaged resources implement a finalizer.
// Uncomment the following code to satisfy rule:
// DisposableTypesShouldDeclareFinalizer
// ~TypeA()
// {
// Dispose(false);
// }
}
Aturan terkait
CA1816: Panggil GC.SuppressFinalize dengan benar