Aracılığıyla paylaş


CA2211: Sabit olmayan alanlar görünür olmamalıdır

Özellik Değer
Kural Kimliği CA2211
Başlık Sabit olmayan alanlar görünür olmamalıdır
Kategori Kullanım
Hataya neden olan veya bozulmayan düzeltme Yeni
.NET 9'da varsayılan olarak etkin Öneri olarak

Neden

Genel veya korumalı statik alan sabit değildir ve salt okunur değildir.

Kural açıklaması

Ne sabitler, ne de salt okunur olan statik alanlar güvenli iş parçacığı değildir. Böyle bir alana erişim dikkatle denetlenmelidir ve sınıf nesnesine erişimi eşitlemek için gelişmiş programlama teknikleri gerektirir. Bunlar öğrenmesi zor beceriler olduğundan ve bu tür bir nesneyi test etmek kendi zorluklarını oluşturduğundan, statik alanlar değişmeyen verileri depolamak için en iyi şekilde kullanılır. Bu kural kitaplıklar için geçerlidir; uygulamalar hiçbir alanı kullanıma sunmamalıdır.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için statik alanı sabit veya salt okunur yapın. Bu mümkün değilse, türü, temel alan için iş parçacığı güvenli erişimi yöneten iş parçacığı güvenli özelliği gibi alternatif bir mekanizma kullanacak şekilde yeniden tasarlayın. Kilit çekişmesi ve kilitlenmeler gibi sorunların kitaplığın performansını ve davranışını etkileyebileceğini fark edin.

Uyarıların ne zaman bastırılması gerekiyor?

Bir uygulama geliştiriyorsanız ve bu nedenle statik alanı içeren türe erişim üzerinde tam denetime sahipseniz, bu kuraldan gelen bir uyarıyı gizlemeniz güvenlidir. Kitaplık tasarımcıları bu kuraldan gelen bir uyarıyı gizlememelidir; sabit olmayan statik alanların kullanılması, kitaplığın geliştiricilerin doğru şekilde kullanılmasını zorlaştırabilir.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none olarak ayarlayın.

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

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Örnek

Aşağıdaki örnekte bu kuralı ihlal eden bir tür gösterilmektedir.


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;
}