CA2011: Jangan tetapkan properti di dalam pengaturan properti
Properti | Nilai |
---|---|
ID Aturan | CA2011 |
Judul | Jangan tetapkan properti dalam setter-nya |
Golongan | Keandalan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | Sebagai saran |
Penyebab
Properti secara tidak sengaja diberi nilai dalam pengakses kumpulan properti itu sendiri.
Deskripsi aturan
Menetapkan properti ke dirinya sendiri di aksesor yang ditetapkan mengarah ke rantai panggilan rekursif yang tak terbatas ke aksesor yang ditetapkan. Ini menghasilkan StackOverflowException pada waktu proses. Kesalahan seperti itu umum terjadi ketika properti dan bidang backing untuk menyimpan nilai properti memiliki nama yang sama. Alih-alih menetapkan nilai ke bidang backing, nilai tersebut secara tidak sengaja ditetapkan ke properti itu sendiri.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran, ganti penetapan yang melanggar ke properti dengan penugasan ke bidang backing atau beralih menggunakan properti otomatis. Misalnya, cuplikan kode berikut menunjukkan pelanggaran aturan dan beberapa cara untuk memperbaikinya:
public class C
{
// Backing field for property 'P'
private int p;
public int P
{
get
{
return p;
}
set
{
// CA2011: Accidentally assigned to property, instead of the backing field.
P = value;
}
}
}
public class C
{
// Backing field for property 'P'
private int _p;
public int P
{
get
{
return _p;
}
set
{
// Option 1: Assign to backing field and rename the backing field for clarity.
_p = value;
}
}
}
public class C
{
// Option 2: Use auto-property.
public int P { get; set; }
}
Kapan harus menekan peringatan
Tidak masalah untuk menekan pelanggaran dari aturan ini jika Anda yakin bahwa panggilan rekursif ke aksesor set dijaga secara kondisional untuk mencegah rekursi tak terbatas.
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 CA2011
// The code that's violating the rule is on this line.
#pragma warning restore CA2011
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2011.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.