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 | CA2213 |
| Judul | Bidang sekali pakai harus dihapus |
| Kategori | Penggunaan |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Tidak |
| Bahasa yang berlaku | C# dan Visual Basic |
Penyebab
Jenis yang menerapkan System.IDisposable mendeklarasikan bidang yang merupakan jenis yang juga menerapkan IDisposable. Metode Dispose dari bidang tidak dipanggil oleh metode Dispose dari jenis yang mendeklarasikan.
Deskripsi aturan
Jenis bertanggung jawab untuk membuang semua sumber daya yang tidak dikelola. Aturan CA2213 memeriksa apakah jenis yang bisa dibuang (yaitu, yang mengimplementasikan IDisposable) T mendeklarasikan bidang F yang merupakan instans dari jenis yang bisa dibuang FT. Untuk setiap bidang F yang diberi objek yang dibuat secara lokal dalam metode atau penginisialisasi dari jenis yang berisi T, aturan mencoba menemukan panggilan ke FT.Dispose. Aturan mencari metode yang dipanggil oleh T.Dispose dan satu tingkat lebih rendah (yaitu, metode yang dipanggil oleh metode yang dipanggil oleh T.Dispose).
Catatan
Selain kasus khusus, aturan CA2213 hanya diaktifkan untuk bidang yang diberi objek sekali pakai yang dibuat secara lokal dalam metode dan inisialisasi jenis yang berisi. Jika objek dibuat atau ditetapkan di luar jenis T, aturan tidak diaktifkan. Ini mengurangi kebisingan untuk kasus di mana jenis yang berisi tidak memiliki tanggung jawab untuk membuang objek.
Kasus khusus
Aturan CA2213 juga dapat diaktifkan untuk bidang dari jenis berikut meskipun objek yang ditetapkan tidak dibuat secara lokal:
Meneruskan objek dari salah satu jenis ini ke konstruktor lalu menetapkannya ke bidang menunjukkan transfer kepemilikan buang ke jenis yang baru dibangun. Artinya, jenis yang baru dibangun sekarang bertanggung jawab untuk menghapus objek. Jika objek tidak dibuang, pelanggaran CA2213 terjadi.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, panggil Dispose pada bidang yang memiliki jenis yang mengimplementasikan IDisposable.
Kapan harus menekan peringatan
Aman untuk menyembunyikan peringatan dari aturan ini jika:
- Jenis yang ditandai tidak bertanggung jawab untuk merilis sumber daya yang dipegang oleh bidang (yaitu, jenis tersebut tidak memiliki kepemilikan dispose)
- Panggilan ke Dispose terjadi pada tingkat panggilan yang lebih dalam daripada pemeriksaan aturan
- kepemilikan bidang tidak dimiliki oleh tipe yang mengandung.
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 CA2213
// The code that's violating the rule is on this line.
#pragma warning restore CA2213
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2213.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Mengonfigurasi analisis aliran data
Gunakan opsi berikut untuk mengonfigurasi analisis aliran data untuk aturan ini:
- jenis_analisis_antarprosedural
- max_interprocedural_lambda_or_local_function_call_chain
- rantai_panggilan_metode_interprosedural_maksimum
- points_to_analysis_kind
- copy_analysis
- JumlahIterasi_Cukup_untuk_algoritma_KDF_lemah
Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang dikenakan, atau untuk semua aturan dalam kategori Keamanan yang dikenakan. Untuk informasi selengkapnya, lihat opsi konfigurasi aturan kualitas kode .
Contoh
Cuplikan berikut menunjukkan jenis TypeA yang mengimplementasikan IDisposable.
public class TypeA : IDisposable
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose managed resources
}
// Free native resources
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// Disposable types implement a finalizer.
~TypeA()
{
Dispose(false);
}
}
Cuplikan berikut menunjukkan jenis TypeB yang melanggar aturan CA2213 dengan mendeklarasikan bidang aFieldOfADisposableType sebagai tipe sekali pakai (TypeA) dan tidak memanggil Dispose pada bidang .
public class TypeB : IDisposable
{
// Assume this type has some unmanaged resources.
TypeA aFieldOfADisposableType = new();
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
// Violates rule: DisposableFieldsShouldBeDisposed.
// Should call aFieldOfADisposableType.Dispose();
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
if (!disposed)
{
// Dispose of resources held by this instance.
Dispose(true);
}
}
// Disposable types implement a finalizer.
~TypeB()
{
Dispose(false);
}
}
Untuk memperbaiki pelanggaran ini, panggil Dispose() pada variabel sekali pakai:
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
aFieldOfADisposableType.Dispose();
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}