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