CA2211: неконстантные поля должны быть скрыты

Свойство Значение
Идентификатор правила CA2211
Заголовок Поля, не являющиеся константами, не должны быть видимыми
Категория Использование
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

Открытое или защищенное статическое поле не является константой и не предназначено только для чтения.

Описание правила

Для статических полей, которые не являются константными и доступными только для чтения, невозможно обеспечить потокобезопасность. Доступ к подобным полям должен тщательно контролироваться, и для синхронизации доступа к такому объекту класса требуются дополнительные методы программирования. Поскольку эти навыки сложно освоить и тестирование таких объектов само по себе представляет сложность, статические поля лучше использовать для хранения данных, которые не изменяются. Это правило применяется к библиотекам; приложения не должны предоставлять какие бы то ни было поля.

Устранение нарушений

Чтобы устранить нарушение этого правила, сделайте статическое поле константой или доступным только для чтения. Если это невозможно, измените тип для использования альтернативного механизма, такого как поточно-ориентированное свойство, которое управляет потокобезопасным доступом к базовому полю. Учтите, что такие проблемы, как конфликты при блокировке и взаимоблокировки, могут повлиять на производительность и поведение библиотеки.

Когда лучше отключить предупреждения

Предупреждение, связанное с этим правилом, можно отключить, если вы разрабатываете приложение и имеете полный контроль над доступом к типу, содержащему статическое поле. Конструкторы библиотек не должны подавлять предупреждение, связанное с этим правилом. Использование неконстантных статических полей может усложнить корректное использование библиотеки разработчиками.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Пример

В следующем примере показан тип, нарушающий это правило.


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