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