Udostępnij za pośrednictwem


CA2211: Niestałe pola nie powinny być widoczne

TypeName

NonConstantFieldsShouldNotBeVisible

CheckId

CA2211

Kategoria

Microsoft.Usage

Złamanie zmiany

Złamanie

Przyczyna

Publiczne lub chronionych pola statycznego nie jest stała, ani nie jest tylko do odczytu.

Opis reguły

Statyczne pola, które są stałe ani nie są tylko do odczytu nie wielowątkowość.Dostęp do takiego pola musi być starannie kontrolowany i wymaga zaawansowanej techniki programowania dla synchronizacji dostępu do obiektu klasy.Te są trudne umiejętności, aby dowiedzieć się, ponieważ wzorca i badania takiego obiektu stwarza wyzwania własnej, statyczne pola najlepiej służą do przechowywania danych, który nie jest zmieniany.Ta reguła ma zastosowanie do bibliotek; aplikacje nie powinny wystawiać żadnych pól.

Jak naprawić naruszenia

Aby naprawić naruszenie tej zasady, należy pola statycznego stałej lub tylko do odczytu.Jeśli nie jest to możliwe, należy ponownie zaprojektować typu użyć mechanizmu alternatywnego, takie jak właściwości wielowątkowość, który zarządza wielowątkowość dostęp do odpowiedniego pola.Okazuje się, że takie zagadnienia jak rywalizacji blokad i zakleszczeń może wpłynąć na wydajność i zachowanie biblioteki.

Kiedy do pomijania ostrzeżenia

Bezpiecznie pomija ostrzeżenia, od tej zasady opracowywania aplikacji i dlatego mają pełną kontrolę nad dostępem do typu, który zawiera pola statycznego.Projektanci biblioteki nie należy pomijać ostrzeżenie od tej zasady; za pomocą pola statycznego-stała można wprowadzać przy użyciu biblioteki trudne dla deweloperów do używać poprawnie.

Przykład

Poniższy przykład pokazuje typ, który narusza tej reguły.

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