Bagikan melalui


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 8 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.

Baca juga