Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1051 |
| Заголовок | Не объявляйте видимые поля экземпляров |
| Категория | Проектирование |
| Исправление является критическим или не критическим | Срочное |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Тип имеет поле экземпляра, не являющееся частным.
По умолчанию это правило проверяет только видимые извне типы, но это поведение можно настроить.
Описание правила
Основное назначение поля — служить деталями реализации. Поля должны быть помечены как 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
{
public int InstanceData { get; set; } = 32;
}