Правила именования для стиля кода
В файле EDITORCONFIG можно определить соглашения об именовании для элементов кода языка программирования .NET, таких как классы, свойства и методы, а также способ применения этих соглашений компилятором или интегрированной средой разработки. Например, можно указать, что открытый член без прописной буквы должен рассматриваться как ошибка компилятора, или что если частное поле не начинается с _
, должно быть выдано предупреждение о сборке.
В частности, можно определить правило именования, состоящее из трех частей:
- Группа символов, к которой применяется это правило, например открытые элементы или закрытые поля.
- Стиль именования, связываемый с этим правилом, например обязательное использование прописных букв или использование символа подчеркивания в качестве первого символа имени.
- Уровень серьезности сообщения, когда элементы кода, включенные в группу символов, не соответствуют стилю именования.
Общий синтаксис
Чтобы определить любую из указанных выше сущностей (правило именования, группу символов или стиль именования), задайте одно или несколько свойств с помощью следующего синтаксиса:
<kind>.<entityName>.<propertyName> = <propertyValue>
Все параметры свойств для заданного kind
и entityName
составляют это определение конкретной сущности.
Каждое свойство может быть задано только один раз, но некоторые параметры допускают несколько значений, разделенных запятыми.
Порядок свойств не имеет значения.
<значения kind>
<kind> указывает, какой тип сущности определяется (правило именования, группа символов или стиль именования) и должен быть одним из следующих:
Для чего задается свойство | <Использование значения типа> | Пример |
---|---|---|
Правило именования | dotnet_naming_rule |
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion |
Группа символов | dotnet_naming_symbols |
dotnet_naming_symbols.interface.applicable_kinds = interface |
Стиль именования | dotnet_naming_style |
dotnet_naming_style.pascal_case.capitalization = pascal_case |
<entityName>
<entityName> — это выбранное описательное имя, которое связывает несколько параметров свойств в одном определении. Например, следующие свойства создают два определения группы символов (interface
и types
) и устанавливают для каждого из них два свойства.
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum, delegate
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
<propertyName> и <propertyValue>
Каждый тип сущности — правило именования, группа символов или стиль именования — имеет собственные поддерживаемые свойства, как описано в следующих разделах.
Свойства группы символов
Для групп символов можно задать следующие свойства, которые ограничивают набор включаемых в группу символов. Чтобы указать для одного свойства несколько значений, разделите их запятыми.
Свойство | Описание | Допустимые значения | Обязательно |
---|---|---|---|
applicable_kinds |
Типы символов в группе 1 | * (используйте это значение, чтобы указать все символы)namespace class struct interface enum property method field event delegate parameter type_parameter local local_function |
Да |
applicable_accessibilities |
Уровни доступности для символов в группе | * (используйте это значение, чтобы указать все уровни доступа)public internal либо friend private protected protected_internal или protected_friend private_protected local (для символов, определенных в методе) |
Да |
required_modifiers |
Соответствует только тем символам, у которых есть все указанные модификаторы 2 | abstract либо must_inherit async const readonly static или shared 3 |
Нет |
Примечания.
- Элементы кортежа в настоящее время поддерживаются только в
applicable_kinds
. - Группа символов сопоставляет все модификаторы в свойстве
required_modifiers
. Если вы опустите это свойство, для сопоставления не требуются конкретные модификаторы. Это означает, что модификаторы символов не оказывают влияния на применение этого правила. - Если группа имеет значение
static
илиshared
в свойствеrequired_modifiers
, в нее будут включены также символыconst
, так как они неявно являютсяstatic
/Shared
. Но если вы не хотите применять правило именованияstatic
к символамconst
, вы можете создать новое правило именования для группы символовconst
. Новое правило будет иметь приоритет в соответствии с порядком правил. class
включает записи (record) C#.
Свойства стиля именования
Стиль именования определяет соглашения, которые будут применяться к правилу. Например:
- Использование прописных букв
PascalCase
- Начинается с
m_
- Заканчивается на
_g
- Разделение слов с помощью
__
Для стиля именования можно задать следующие свойства:
Свойство | Описание | Допустимые значения | Обязательно |
---|---|---|---|
capitalization |
Стиль применения прописных букв для слов в пределах символа | pascal_case camel_case first_word_upper all_upper all_lower |
Да1 |
required_prefix |
Должно начинаться с этих символов | Нет | |
required_suffix |
Должно заканчиваться этими символами | Нет | |
word_separator |
Слова внутри символа должны разделяться этим символом | Нет |
Примечания.
- Указать регистр букв для стиля именования обязательно, в противном случае ваш стиль может игнорироваться.
Свойства правила именования
Чтобы правило вступило в силу, должны быть указаны все свойства правила именования.
Свойство | Описание |
---|---|
symbols |
Имя группы символов, определенное в другом месте; Правило именования будет применено к символам в этой группе |
style |
Имя стиля именования, которое должно быть связано с этим правилом; стиль определяется в другом месте |
severity |
Задает серьезность, с которой будет применяться это правило именования. Задает для сопоставленного значения один из доступных уровней серьезности1 |
Примечания.
- Спецификация серьезности в правиле именования учитывается только в интегрированных средах разработки, таких как Visual Studio. Компиляторы C# или VB не понимают этот параметр и не учитывают его при сборке. Чтобы применить правила стиля именования к сборке, уровень серьезности следует задать с помощью конфигурации серьезности в правиле кода. См. дополнительные сведения на сайте GitHub.
Порядок правил
Порядок определения правил в файле EditorConfig не имеет значения. Правила именования автоматически упорядочиваются в соответствии с определениями самих правил. Более конкретные правила, касающиеся специальных возможностей, модификаторов и символов, имеют приоритет над менее конкретными правилами. Если правила перекрываются или порядок правил вызывает проблемы, можно разбить пересечение двух правил на новое правило, которое имеет приоритет над более широкими правилами, от которых оно было получено. Примеры см. в разделах Пример. Перекрывающиеся стратегии именования и Пример: const
модификатор включает static
и readonly
.
Расширение языковой службы EditorConfig может анализировать файл EditorConfig и сообщать о случаях, когда порядок правил в файле отличается от того, который будет использоваться компилятором во время выполнения.
Примечание
Если вы используете версию Visual Studio, более раннюю, чем Visual Studio 2019, правила именования должны быть упорядочены от наиболее конкретных к наименее конкретным в файле EditorConfig. Применяться будет только первое обнаруженное правило. Но при наличии множества свойств правил с одним и тем же именем приоритет будет иметь последнее обнаруженное свойство с таким именем. См. подробнее об иерархии файлов и приоритетности.
Пример. Перекрывающиеся стратегии именования
Рассмотрим следующие два правила именования:
- Открытые методы — PascalCase.
- Асинхронные методы заканчиваются на
"Async"
.
Для public async
методов не ясно, какое правило имеет приоритет. Можно создать новое правило для public async
методов и точно указать именование.
Пример: const
модификатор включает static
и readonly
Рассмотрим следующие два правила именования:
- Поля констант — PascalCase.
- Поля, не являющиеся открытыми
static
, s_camelCase.
Правило 2 более специфично и имеет приоритет, поэтому все поля констант, не являющиеся открытыми, s_camelCase. Чтобы устранить эту проблему, можно определить правило пересечения: поля не являются открытыми константами PascalCase.
Стили именования по умолчанию
Если вы не укажете никаких пользовательских правил именования, применяются следующие стили по умолчанию:
Для классов, структур, перечислений, свойств, методов и событий со специальными возможностями по умолчанию используется стиль именования Pascal.
Для интерфейсов со специальными возможностями по умолчанию используется стиль именования Pascal с обязательным префиксом I.
Идентификатор правила кода: IDE1006 (Naming rule violation)
Все параметры именования имеют идентификатор правила IDE1006
и заголовок Naming rule violation
. Серьезность для нарушений именования можно настроить глобально в файле EditorConfig, используя следующий синтаксис:
dotnet_diagnostic.IDE1006.severity = <severity value>
Серьезность должна иметь значение warning
или error
, чтобы принудительно применяться при сборке. Все возможные значения серьезности перечислены на странице об уровнях серьезности.
Пример. Заглавная буква открытого члена
Следующий файл .editorconfig содержит соглашение об именовании, которое указывает, что открытые свойства, методы, поля, события и делегаты, помеченные должны быть прописными readonly
буквами. Это соглашение об именовании определяет несколько типов символов, к которые применяется правило, используя запятую для разделения значений.
[*.{cs,vb}]
# Defining the 'public_symbols' symbol group
dotnet_naming_symbols.public_symbols.applicable_kinds = property,method,field,event,delegate
dotnet_naming_symbols.public_symbols.applicable_accessibilities = public
dotnet_naming_symbols.public_symbols.required_modifiers = readonly
# Defining the 'first_word_upper_case_style' naming style
dotnet_naming_style.first_word_upper_case_style.capitalization = first_word_upper
# Defining the 'public_members_must_be_capitalized' naming rule, by setting the
# symbol group to the 'public symbols' symbol group,
dotnet_naming_rule.public_members_must_be_capitalized.symbols = public_symbols
# setting the naming style to the 'first_word_upper_case_style' naming style,
dotnet_naming_rule.public_members_must_be_capitalized.style = first_word_upper_case_style
# and setting the severity.
dotnet_naming_rule.public_members_must_be_capitalized.severity = suggestion
Пример. Поля частного экземпляра с символом подчеркивания
Этот фрагмент файла .editorconfig принудительно указывает, что поля частного _
экземпляра должны начинаться с ; если это соглашение не соблюдается, интегрированная среда разработки будет рассматривать его как ошибку компилятора. Закрытые статические поля игнорируются.
Так как группу символов можно определить только на основе имеющихся у нее идентификаторов (например, static
или readonly
), а не по идентификаторам, которых у нее нет (например, по полю экземпляра static
из-за отсутствия ), необходимо определить два правила именования:
- Все закрытые поля должны
static
underscored
иметь стиль именования, применяемый к ним в качестве компилятораerror
. - Закрытые поля с
static
должны иметьunderscored
стиль именования, применяемый к ним с уровнемnone
серьезности ; иными словами, игнорируйте этот случай.
[*.{cs,vb}]
# Define the 'private_fields' symbol group:
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
# Define the 'private_static_fields' symbol group
dotnet_naming_symbols.private_static_fields.applicable_kinds = field
dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private
dotnet_naming_symbols.private_static_fields.required_modifiers = static
# Define the 'underscored' naming style
dotnet_naming_style.underscored.capitalization = pascal_case
dotnet_naming_style.underscored.required_prefix = _
# Define the 'private_fields_underscored' naming rule
dotnet_naming_rule.private_fields_underscored.symbols = private_fields
dotnet_naming_rule.private_fields_underscored.style = underscored
dotnet_naming_rule.private_fields_underscored.severity = error
# Define the 'private_static_fields_none' naming rule
dotnet_naming_rule.private_static_fields_none.symbols = private_static_fields
dotnet_naming_rule.private_static_fields_none.style = underscored
dotnet_naming_rule.private_static_fields_none.severity = none
В этом примере также показано, что определения сущностей можно использовать повторно. Стиль underscored
именования используется как правилами именования, private_fields_underscored
так и private_static_fields_none
.