Regras de nomenclatura em estilo de código
Em seu arquivo .editorconfig , você pode definir convenções de nomenclatura para seus elementos de código da linguagem de programação .NET, como classes, propriedades e métodos, e como o compilador ou IDE deve impor essas convenções. Por exemplo, você pode especificar que um membro público que não esteja em maiúsculas deve ser tratado como um erro de compilador ou que, se um campo privado não começar com um _
, um aviso de compilação deve ser emitido.
Especificamente, você pode definir uma regra de nomenclatura, que consiste em três partes:
- O grupo de símbolos ao qual a regra se aplica, por exemplo, membros públicos ou campos privados.
- O estilo de nomenclatura a ser associado à regra, por exemplo, de que o nome deve ser maiúsculo ou começar com um sublinhado.
- O nível de gravidade da mensagem quando os elementos de código incluídos no grupo de símbolos não seguem o estilo de nomenclatura.
Sintaxe geral
Para definir qualquer uma das entidades acima — uma regra de nomenclatura, um grupo de símbolos ou um estilo de nomenclatura — defina uma ou mais propriedades usando a seguinte sintaxe:
<kind>.<entityName>.<propertyName> = <propertyValue>
Todas as configurações de propriedade para um determinado kind
e entityName
compõem essa definição de entidade específica.
Cada propriedade deve ser definida apenas uma vez, mas algumas configurações permitem vários valores separados por vírgula.
A ordem das propriedades não é importante.
<valores de tipo>
<sort> especifica qual tipo de entidade está sendo definido — regra de nomenclatura, grupo de símbolos ou estilo de nomenclatura — e deve ser um dos seguintes:
Para definir uma propriedade para | Use o <valor de tipo> | Exemplo |
---|---|---|
Regra de nomenclatura | dotnet_naming_rule |
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion |
Grupo de símbolos | dotnet_naming_symbols |
dotnet_naming_symbols.interface.applicable_kinds = interface |
Estilo de nomenclatura | dotnet_naming_style |
dotnet_naming_style.pascal_case.capitalization = pascal_case |
<nome_da_entidade>
<entityName> é um nome descritivo escolhido por você que associa várias configurações de propriedade em uma única definição. Por exemplo, as propriedades a seguir produzem duas definições de grupo de símbolos e types
, cada uma com duas propriedades definidasinterface
.
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> e <propertyValue>
Cada tipo de entidade — regra de nomenclatura, grupo de símbolos ou estilo de nomenclatura — tem suas próprias propriedades suportadas, conforme descrito nas seções a seguir.
Propriedades do grupo de símbolos
Você pode definir as seguintes propriedades para grupos de símbolos, para limitar quais símbolos são incluídos no grupo. Para especificar vários valores para uma única propriedade, separe os valores com uma vírgula.
Property | Description | Valores permitidos | Necessário |
---|---|---|---|
applicable_kinds |
Tipos de símbolos no grupo 1 | * (use este valor para especificar todos os símbolos)namespace class struct interface enum property method field event delegate parameter type_parameter local local_function |
Sim |
applicable_accessibilities |
Níveis de acessibilidade dos símbolos no grupo | * (use este valor para especificar todos os níveis de acessibilidade)public internal ou friend private protected protected_internal ou protected_friend private_protected local (para símbolos definidos dentro de um método) |
Sim |
required_modifiers |
Corresponder apenas símbolos com todos os modificadores especificados 2 | abstract ou must_inherit async const readonly static ou shared 3 |
Não |
Notas:
- Atualmente, os membros do Tuple não são suportados no
applicable_kinds
. - O grupo de símbolos corresponde a
required_modifiers
todos os modificadores na propriedade. Se você omitir essa propriedade, nenhum modificador específico será necessário para uma correspondência. Isso significa que os modificadores de um símbolo não têm efeito sobre se essa regra é ou não aplicada. - Se o seu grupo tiver
static
oushared
na propriedade, o grupo também incluiráconst
símbolos porque eles estão implicitamenteShared
static
/ .required_modifiers
No entanto, se não quiser que astatic
regra de nomenclatura se aplique aosconst
símbolos, você pode criar uma nova regra de nomenclatura com um grupo de símbolos deconst
. A nova regra terá precedência de acordo com a ordem das regras. class
inclui registros C#.
Nomeando propriedades de estilo
Um estilo de nomenclatura define as convenções que você deseja impor com a regra. Por exemplo:
- Capitalize com
PascalCase
- Começa com
m_
- Termina com
_g
- Separe as palavras com
__
Você pode definir as seguintes propriedades para um estilo de nomenclatura:
Property | Description | Valores permitidos | Necessário |
---|---|---|---|
capitalization |
Estilo de maiúsculas para palavras dentro do símbolo | pascal_case camel_case first_word_upper all_upper all_lower |
Sim1 |
required_prefix |
Deve começar com estes caracteres | Não | |
required_suffix |
Deve terminar com estes caracteres | Não | |
word_separator |
As palavras dentro do símbolo precisam ser separadas com este caractere | Não |
Notas:
- Você deve especificar um estilo de maiúsculas como parte do seu estilo de nomenclatura, caso contrário, seu estilo de nomenclatura pode ser ignorado.
Propriedades da regra de nomenclatura
Todas as propriedades da regra de nomenclatura são necessárias para que uma regra entre em vigor.
Property | Description |
---|---|
symbols |
O nome de um grupo de símbolos definido em outro lugar; A regra de nomenclatura será aplicada aos símbolos deste grupo |
style |
O nome do estilo de nomenclatura que deve ser associado a esta regra; o estilo é definido em outro lugar |
severity |
Define a severidade com a qual impor a regra de nomenclatura. Defina o valor associado para um dos níveis de gravidade disponíveis.1 |
Notas:
- A especificação de gravidade dentro de uma regra de nomenclatura só é respeitada dentro de IDEs de desenvolvimento, como o Visual Studio. Essa configuração não é compreendida pelos compiladores C# ou VB, portanto, não é respeitada durante a compilação. Para impor regras de estilo de nomenclatura na compilação, você deve, em vez disso, definir a severidade usando a configuração de severidade da regra de código. Para obter mais informações, consulte este problema do GitHub.
Ordem das regras
A ordem na qual as regras de nomenclatura são definidas em um arquivo EditorConfig não importa. As regras de nomenclatura são ordenadas automaticamente de acordo com as definições das próprias regras. Regras mais específicas relativas a acessibilidades, modificadores e símbolos têm precedência sobre regras menos específicas. Se houver sobreposição entre regras ou se a ordenação da regra causar problemas, você pode dividir a interseção das duas regras em uma nova regra que tenha precedência sobre as regras mais amplas das quais ela foi derivada. Para obter exemplos, consulte Exemplo: estratégias de nomenclatura sobrepostas e Exemplo: const
modificador inclui static
e readonly
.
A extensão EditorConfig Language Service pode analisar um arquivo EditorConfig e relatar casos em que a ordem de ordenação no arquivo é diferente do que o compilador usará em tempo de execução.
Nota
Se você estiver usando uma versão do Visual Studio anterior ao Visual Studio 2019, as regras de nomenclatura devem ser ordenadas do mais específico para o menos específico no arquivo EditorConfig. A primeira regra encontrada que pode ser aplicada é a única regra que é aplicada. No entanto, se houver várias propriedades de regra com o mesmo nome, a propriedade encontrada mais recentemente com esse nome terá precedência. Para obter mais informações, consulte Hierarquia e precedência de arquivos.
Exemplo: Estratégias de nomenclatura sobrepostas
Considere as duas regras de nomenclatura a seguir:
- Os métodos públicos são PascalCase.
- Os métodos assíncronos terminam com
"Async"
.
Para public async
os métodos, não é óbvio qual regra tem precedência. Você pode criar uma nova regra para public async
métodos e especificar a nomenclatura exatamente.
Exemplo: const
modificador inclui static
e readonly
Considere as duas regras de nomenclatura a seguir:
- Os campos constantes são PascalCase.
- Os campos não públicos
static
são s_camelCase.
A regra 2 é mais específica e tem precedência, pelo que todos os campos constantes não públicos são s_camelCase. Para resolver o problema, você pode definir uma regra de interseção: campos constantes não públicos são PascalCase.
Estilos de nomenclatura padrão
Se você não especificar nenhuma regra de nomenclatura personalizada, os seguintes estilos padrão serão usados:
Para classes, structs, enumerações, propriedades, métodos e eventos com qualquer acessibilidade, o estilo de nomenclatura padrão é Pascal case.
Para interfaces com qualquer acessibilidade, o estilo de nomenclatura padrão é Pascal case com um prefixo necessário de I.
ID da regra de código: IDE1006 (Naming rule violation)
Todas as opções de nomenclatura têm ID IDE1006
e título Naming rule violation
da regra. Você pode configurar a gravidade das violações de nomenclatura globalmente em um arquivo EditorConfig com a seguinte sintaxe:
dotnet_diagnostic.IDE1006.severity = <severity value>
O valor de severidade deve ser warning
ou a ser imposto na compilaçãoerror
. Para todos os valores de gravidade possíveis, consulte Nível de gravidade.
Exemplo: capitalização de membro público
O seguinte arquivo .editorconfig contém uma convenção de nomenclatura que especifica que as propriedades públicas, métodos, campos, eventos e delegados marcados readonly
devem ser capitalizados. Esta convenção de nomenclatura especifica vários tipos de símbolo aos quais aplicar a regra, usando uma vírgula para separar os valores.
[*.{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
Exemplo: campos de instância privada com sublinhado
Este trecho do arquivo .editorconfig impõe que os campos de instância privada devem começar com um _
; se essa convenção não for seguida, o IDE irá tratá-lo como um erro de compilador. Os campos estáticos privados são ignorados.
Como você só pode definir um grupo de símbolos com base nos identificadores que ele tem (por exemplo, static
ou readonly
), e não pelos identificadores que ele não tem (por exemplo, um campo de instância porque não tem static
), você precisa definir duas regras de nomenclatura:
- Todos os campos privados —
static
ou não — devem ter ounderscored
estilo de nomenclatura aplicado a eles como um compiladorerror
. - Campos privados com
static
devem ter ounderscored
estilo de nomenclatura aplicado a eles com um nível de severidade denone
; em outras palavras, ignore este caso.
[*.{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
Este exemplo também demonstra que as definições de entidade podem ser reutilizadas. O underscored
estilo de nomenclatura é usado pelas private_fields_underscored
regras de nomenclatura e private_static_fields_none
nomenclatura.