Freigeben über


CA2211: Nicht konstante Felder sollten nicht sichtbar sein.

Eigenschaft Wert
Regel-ID CA2211
Titel Nicht konstante Felder sollten nicht sichtbar sein.
Kategorie Verwendung
Fix führt oder führt nicht zur Unterbrechung Breaking
Standardmäßig in .NET 9 aktiviert Als Vorschlag

Ursache

Ein öffentliches oder geschütztes statisches Feld ist weder konstant noch schreibgeschützt.

Regelbeschreibung

Statische Felder, die weder konstant noch schreibgeschützt sind, sind nicht threadsicher. Der Zugriff auf ein solches Feld muss sorgfältig kontrolliert werden und erfordert fortgeschrittene Programmiertechniken zur Synchronisierung des Zugriffs auf das Klassenobjekt. Da diese Kenntnisse schwierig zu erlernen sind und das Testen eines solchen Objekts ganz eigene Herausforderungen birgt, werden statische Felder am besten zum Speichern von Daten verwendet, die sich nicht ändern. Diese Regel gilt für Bibliotheken. Anwendungen sollten keine Felder verfügbar machen.

Behandeln von Verstößen

Legen Sie fest, dass das statische Feld konstant oder schreibgeschützt ist, um einen Verstoß gegen diese Regel zu korrigieren. Wenn dies nicht möglich ist, gestalten Sie den Typ so um, dass er einen alternativen Mechanismus verwendet, z. B. eine threadsichere Eigenschaft, die den threadsicheren Zugriff auf das zugrunde liegende Feld verwaltet. Beachten Sie, dass Probleme wie Sperrkonflikte und Deadlocks die Leistung und das Verhalten der Bibliothek beeinflussen können.

Wann sollten Warnungen unterdrückt werden?

Es ist sicher, eine Warnung dieser Regel zu unterdrücken, wenn Sie eine Anwendung entwickeln und daher die vollständige Kontrolle über den Zugriff auf den Typ haben, der das statische Feld enthält. Bibliotheksentwickler sollten eine Warnung dieser Regel nicht unterdrücken. Die Verwendung nicht konstanter statischer Felder kann die korrekte Verwendung der Bibliothek für Entwickler erschweren.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Beispiel

Das folgende Beispiel zeigt einen Typ, der gegen diese Regel verstößt.


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