CA1051: не объявляйте видимые поля экземпляров

Свойство Значение
Идентификатор правила CA1051
Заголовок Не объявляйте видимые поля экземпляров
Категория Проектирование
Исправление является критическим или не критическим Критическое
Включен по умолчанию в .NET 8 No

Причина

Тип имеет поле экземпляра, не являющееся частным.

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

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

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

Свойства, которые просто возвращают значение закрытого или внутреннего поля, оптимизированы для получения производительности на уровне доступа к полю; выигрыш в производительности от использования внешних видимых полей вместо свойств является минимальным. Видимыми извне называются уровни доступности public, protected и protected internal (Public, Protected и Protected Friend в Visual Basic).

Кроме того, открытые поля не могут быть защищены Требованиями связывания. (Требования связывания не применяются к приложениям .NET Core.)

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

Чтобы устранить нарушение этого правила, создайте поле private или internal и предоставьте его с помощью свойства, видимого извне.

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

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

Пользователям может потребоваться доступ к полям в следующих ситуациях:

  • В элементах управления содержимым веб-форм ASP.NET.
  • Когда целевая платформа использует ref для изменения полей, например в случае платформ модель — представление — модель представления (MVVM) для WPF и UWP.

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

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

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

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

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

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

Включение или исключение API

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

Эти параметры можно настроить только для этого правила, для всех правил, к которым она применяется, или для всех правил в этой категории (конструктор), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.

Включение определенных контактных зон API

Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Исключение структур

Вы можете исключить поля struct (Structure в Visual Basic) из анализа.

dotnet_code_quality.ca1051.exclude_structs = true

Пример

В следующем примере показан тип (BadPublicInstanceFields), нарушающий это правило. GoodPublicInstanceFields отображает исправленный код.

public class BadPublicInstanceFields
{
    // Violates rule DoNotDeclareVisibleInstanceFields.
    public int instanceData = 32;
}

public class GoodPublicInstanceFields
{
    private int instanceData = 32;

    public int InstanceData
    {
        get { return instanceData; }
        set { instanceData = value; }
    }
}

См. также