Freigeben über


CA2211: Nicht konstante Felder sollten nicht sichtbar sein

TypeName

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Breaking

Ursache

Ein öffentliches oder geschütztes statisches Feld ist weder konstant noch ist es 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. Weil diese Fertigkeiten schwer zu erlernen sind und das Testen eines solchen Objekts eigene Probleme 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

Um einen Verstoß gegen diese Regel zu beheben, sorgen Sie dafür, dass das statische Feld konstant oder schreibgeschützt ist. Wenn dies nicht möglich ist, gestalten Sie den Typ so um, dass ein alternativer Mechanismus, z. B. eine threadsichere Eigenschaft, verwendet wird, um threadsichere Zugriffe auf das zugrunde liegende Feld zu verwalten. Beachten Sie, dass sich Probleme wie Sperrungskonflikte und Deadlocks auf die Leistung und das Verhalten der Bibliothek auswirken können.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn Sie eine Anwendung entwickeln und daher vollständige Kontrolle über den Typ haben, der das statische Feld enthält. Programmierer von Bibliotheken sollten keine Warnung dieser Regel unterdrücken. Die Verwendung nicht konstanter statischer Felder kann Entwicklern die ordnungsgemäße Verwendung der Bibliothek erschweren.

Beispiel

Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen diese Regel verstößt.


Imports System

Namespace UsageLibrary

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
using System;

namespace UsageLibrary
{
   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;
   }
}