Bagikan melalui


CA2211: Bidang non-konstanta tidak boleh terlihat

Properti Nilai
ID Aturan CA2211
Judul Bidang non-konstan tidak boleh terlihat
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Merusak
Diaktifkan secara default di .NET 8 Sebagai saran

Penyebab

Bidang statis publik atau terproteksi tidak konstanta atau bersifat baca-saja.

Deskripsi aturan

Bidang statik yang bukan konstanta atau baca-saja tidak aman untuk alur. Akses ke bidang tersebut harus dikontrol dengan hati-hati dan memerlukan teknik pemrograman tingkat lanjut untuk menyinkronkan akses ke objek kelas. Karena ini adalah keterampilan yang sulit untuk dipelajari, dan menguji objek seperti itu menimbulkan tantangannya sendiri, bidang statis paling baik digunakan untuk menyimpan data yang tidak berubah. Aturan ini berlaku untuk pustaka; aplikasi tidak boleh mengekspos bidang apa pun.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, buat konstanta bidang statis atau baca-saja. Jika ini tidak memungkinkan, desain ulang jenis untuk menggunakan mekanisme alternatif seperti properti aman utas yang mengelola akses aman utas ke bidang yang mendasar. Sadari bahwa masalah seperti ketidakcocokan kunci dan kebuntuan dapat memengaruhi performa dan perilaku pustaka.

Kapan harus menekan peringatan

Aman untuk menekan peringatan dari aturan ini jika Anda mengembangkan aplikasi dan karena itu memiliki kontrol penuh atas akses ke jenis yang berisi bidang statis. Desainer pustaka tidak boleh menekan peringatan dari aturan ini; menggunakan bidang statis non-konstan dapat membuat penggunaan pustaka sulit digunakan pengembang dengan benar.

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 CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh

Contoh berikut menunjukkan jenis yang melanggar aturan ini.


Imports System

Namespace ca2211

    Public Class SomeStaticFields
        ' Violates rule: AvoidNonConstantStatic;
        ' the field is public and not a literal.
        Public Shared publicField As DateTime = DateTime.Now

        ' Satisfies rule: AvoidNonConstantStatic.
        Public Shared ReadOnly literalField As DateTime = DateTime.Now

        ' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
        ' the field is private.
        Private Shared privateField As DateTime = DateTime.Now
    End Class
End Namespace
public class SomeStaticFields
{
    // Violates rule: AvoidNonConstantStatic;
    // the field is public and not a literal.
    static public DateTime publicField = DateTime.Now;

    // Satisfies rule: AvoidNonConstantStatic.
    public static readonly DateTime literalField = DateTime.Now;

    // Satisfies rule: NonConstantFieldsShouldNotBeVisible;
    // the field is private.
    static DateTime privateField = DateTime.Now;
}