CA1051: не объявляйте видимые поля экземпляров
Свойство | Значение |
---|---|
Идентификатор правила | CA1051 |
Заголовок | Не объявляйте видимые поля экземпляров |
Категория | Проектирование |
Исправление является критическим или не критическим | Критическое |
Включен по умолчанию в .NET 9 | 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_surface. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Заметка
Замените XXXX
частью CAXXXX
идентификатором применимого правила.
Исключение структур
Вы можете исключить поля 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; }
}
}