CA2211: неконстантные поля должны быть скрыты
TypeName |
NonConstantFieldsShouldNotBeVisible |
CheckId |
CA2211 |
Категория |
Microsoft.Usage |
Критическое изменение |
Критическое изменение |
Причина
Открытое или защищенное поле не является константным и доступным только для чтения.
Описание правила
Для статических полей, которые не являются константными и доступными только для чтения, невозможно обеспечить потокобезопасность.Доступ к подобным полям должен тщательно контролироваться, и для синхронизации доступа к такому объекту класса требуются дополнительные методы программирования.Поскольку все это требует особых навыков, которыми трудно овладеть, и тестирования, также создающего свои трудности, статические поля лучше использовать для хранения неизменяемых данных.Это правило применяется к библиотекам; приложения не должны предоставлять поля.
Устранение нарушений
Чтобы устранить нарушение данного правила, сделайте статическое поле константным или доступным только для чтения.Если это невозможно, измените структуру типа, чтобы использовать альтернативный механизм, например потокобезопасное свойство, которое управляет потокобезопасным доступом к базовому полю.Следует понять, что такие проблемы, как конфликт блокировок или взаимоблокировки, могут отрицательно сказаться на производительности или поведении библиотеки.
Отключение предупреждений
Отключение предупреждений о нарушении данного правила безопасно в том случае, если разрабатывается приложение и, следовательно, осуществляется полный контроль над доступом к типу, содержащему статическое поле.Создателям библиотек не следует отключать подобные предупреждения; использование неконстантных статических полей может затруднить правильное использование библиотеки для разработчиков.
Пример
В следующем примере показан тип, который нарушает данное правило.
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;
}
}