Règles de nommage de style de code
Dans votre fichier .editorconfig, vous pouvez définir des conventions d’affectation de noms pour vos éléments de code de langage de programmation .NET, comme les classes, les propriétés et les méthodes, et comment le compilateur ou l’IDE doit appliquer ces conventions. Par exemple, vous pouvez spécifier qu’un membre public qui n’est pas mis en majuscules doit être traité comme une erreur du compilateur, ou que si un champ privé ne commence pas par _
, un avertissement de build doit être émis.
Plus précisément, vous pouvez définir une règle de nommage, qui se compose de trois parties :
- Le groupe de symboles auquel la règle s’applique, par exemple les membres publics ou les champs privés.
- Le style de nommage à associer à la règle, par exemple, en indiquant que le nom doit commencer par une majuscule ou un trait de soulignement.
- Niveau de gravité du message lorsque les éléments de code inclus dans le groupe de symboles ne suivent pas le style de nommage.
Syntaxe générale
Pour définir l’une des entités ci-dessus (une règle de nommage, un groupe de symboles ou un style de nommage), définissez une ou plusieurs propriétés à l’aide de la syntaxe suivante :
<kind>.<entityName>.<propertyName> = <propertyValue>
Tous les paramètres de propriété d’un kind
et d’un entityName
donnés composent cette définition d’entité spécifique.
Chaque propriété ne doit être définie qu’une seule fois, mais certains paramètres autorisent les valeurs multiples séparées par des virgules.
L’ordre des propriétés n’est pas important.
Valeurs pour <kind>
<kind> spécifie le type d’entité défini (règle de nommage, groupe de symboles ou style de nommage) et doit avoir l’une des valeurs suivantes :
Pour définir une propriété pour | Utiliser la valeur <kind> | Exemple |
---|---|---|
Règle de nommage | dotnet_naming_rule |
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion |
Groupe de symboles | dotnet_naming_symbols |
dotnet_naming_symbols.interface.applicable_kinds = interface |
Style de nommage | dotnet_naming_style |
dotnet_naming_style.pascal_case.capitalization = pascal_case |
<nomEntité>
<entityName> est un nom descriptif que vous choisissez qui associe plusieurs paramètres de propriété à une seule définition. Par exemple, les propriétés suivantes produisent deux définitions de groupe de symboles, interface
et types
, chacune ayant deux propriétés définies.
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> et <propertyValue>
Chaque type d’entité (règle de nommage, groupe de symboles ou style de nommage) a ses propres propriétés prises en charge, comme décrit dans les sections suivantes.
Propriétés du groupe de symboles
Vous pouvez définir les propriétés suivantes pour les groupes de symboles afin de limiter les symboles inclus dans le groupe. Pour spécifier plusieurs valeurs pour une seule propriété, séparez les valeurs par une virgule.
Propriété | Description | Valeurs autorisées | Obligatoire |
---|---|---|---|
applicable_kinds |
Types de symboles dans le groupe 1 | * (Utilisez cette valeur pour spécifier tous les symboles.)namespace class struct interface enum property method field event delegate parameter type_parameter local local_function |
Oui |
applicable_accessibilities |
Niveaux d’accessibilité des symboles dans le groupe | * (Utilisez cette valeur pour spécifier tous les niveaux d’accessibilité.)public internal ou friend private protected protected_internal ou protected_friend private_protected local (pour les symboles définis dans une méthode) |
Oui |
required_modifiers |
Faire correspondre uniquement les symboles avec tous les modificateurs spécifiés 2 | abstract ou must_inherit async const readonly static ou shared 3 |
Non |
Remarques :
- Les membres de tuple ne sont actuellement pas pris en charge dans
applicable_kinds
. - Le groupe de symboles correspond à tous les modificateurs de la propriété
required_modifiers
. Si vous omettez cette propriété, aucun modificateur spécifique n’est requis pour une correspondance. Cela signifie que les modificateurs d’un symbole n’ont aucun effet sur l’application ou non de cette règle. - Si votre groupe a
static
oushared
dans la propriétérequired_modifiers
, le groupe inclut également des symbolesconst
, car ils sont implicitementstatic
/Shared
. Toutefois, si vous ne souhaitez pas que la règle de nommagestatic
s’applique aux symbolesconst
, vous pouvez créer une règle de nommage avec un groupe de symboles deconst
. La nouvelle règle est prioritaire d’après l’ordre des règles. class
inclut des enregistrements C#.
Propriétés de style de nommage
Un style de nommage définit les conventions que vous souhaitez appliquer avec la règle. Par exemple :
- Mise en majuscules avec
PascalCase
- Commence par
m_
- Finit par
_g
- Séparer les mots avec
__
Vous pouvez définir les propriétés suivantes pour un style de nommage :
Propriété | Description | Valeurs autorisées | Obligatoire |
---|---|---|---|
capitalization |
Style de mise en majuscules pour les mots dans le symbole | pascal_case camel_case first_word_upper all_upper all_lower |
Oui1 |
required_prefix |
Doit commencer par ces caractères | Non | |
required_suffix |
Doit se terminer par ces caractères | Non | |
word_separator |
Les mots du symbole doivent être séparés par ce caractère | Non |
Remarques :
- Vous devez spécifier un style de mise en majuscules dans le cadre de votre style de nommage, sans quoi votre style de nommage risque d’être ignoré.
Propriétés de la règle de nommage
Toutes les propriétés de règle de nommage sont requises pour qu’une règle prenne effet.
Propriété | Description |
---|---|
symbols |
Le nom d’un groupe de symboles défini ailleurs ; la règle de nommage sera appliquée aux symboles de ce groupe |
style |
Le nom du style de nommage qui doit être associé à cette règle ; le style est défini ailleurs |
severity |
Définit la gravité avec laquelle appliquer la règle de nommage. Définissez la valeur associée sur l’un des niveaux de gravité disponibles. 1 |
Remarques :
- La spécification de gravité dans une règle de nommage est uniquement respectée à l’intérieur des IDE de développement, comme Visual Studio. Ce paramètre n’est pas compris par les compilateurs C# ou VB, et n’est donc pas respecté pendant la génération. Pour appliquer des règles de style de nommage lors de la compilation, vous devez définir la gravité à l’aide de la configuration de la gravité des règles de code. Pour plus d’informations, consultez ce problème GitHub.
Ordre des règles
L’ordre dans lequel les règles de nommage sont définies dans un fichier EditorConfig n’a pas d’importance. Les règles de nommage sont automatiquement triées en fonction des définitions des règles elles-mêmes. Des règles plus spécifiques concernant les accessibilités, les modificateurs et les symboles sont prioritaires sur les règles moins spécifiques. S’il existe un chevauchement entre des règles ou si l’ordre des règles provoque des problèmes, vous pouvez corriger cette intersection des deux règles avec une nouvelle règle qui prend la priorité sur les règles plus larges dont elle a été dérivée. Pour obtenir des exemples, consultez Exemple : Stratégies de nommage qui se chevauchent et Exemple : le modificateur const
inclut static
et readonly
.
L’extension du service de langage EditorConfig peut analyser un fichier EditorConfig et signaler les cas où l’ordre des règles du fichier est différent de celui utilisé par le compilateur au moment de l’exécution.
Notes
Si vous utilisez une version de Visual Studio antérieure à Visual Studio 2019, les règles de nommage doivent être classées de la plus spécifique à la moins spécifique dans le fichier EditorConfig. La première règle applicable rencontrée est la seule règle appliquée. Toutefois, s’il existe plusieurs propriétés de règle portant le même nom, la propriété la plus récemment trouvée portant ce nom est prioritaire. Pour plus d’informations, consultez Priorité et hiérarchie des fichiers.
Exemple : stratégies de nommage qui se chevauchent
Considérez les deux règles de nommage suivantes :
- Les méthodes publiques sont en CassePascal.
- Les méthodes asynchrones se terminent par
"Async"
.
Pour les méthodes public async
, il n’est pas facile de déterminer quelle règle est prioritaire. Vous pouvez créer une règle pour les méthodes public async
et spécifier exactement le nommage.
Exemple : le modificateur const
inclut static
et readonly
Considérez les deux règles de nommage suivantes :
- Les champs de constante sont en CassePascal.
- Les champs non publics
static
sont en s_casseMixte.
La règle 2 étant plus spécifique et prioritaire, tous les champs de constante non publics sont en s_casseMixte. Pour résoudre le problème, vous pouvez définir une règle d’intersection : les champs de constante non publics sont en CassePascal.
Styles de dénomination par défaut
Si vous ne spécifiez pas de règles de dénomination personnalisées, les styles par défaut suivants sont utilisés :
Pour les classes, structures, énumérations, méthodes, propriétés et événements avec tout niveau d’accessibilité, le style de dénomination par défaut est la casse Pascal.
Pour les interfaces avec tout niveau d’accessibilité, le style de dénomination par défaut est la casse Pascal avec le préfixe I requis.
ID de règle de code : IDE1006 (Naming rule violation)
Toutes les options de nommage ont l’ID de règle IDE1006
et le titre Naming rule violation
. Vous pouvez configurer la gravité des violations de nommage globalement dans un fichier EditorConfig avec la syntaxe suivante :
dotnet_diagnostic.IDE1006.severity = <severity value>
La valeur de gravité doit être warning
ou error
pour être appliquée à la compilation. Pour toutes les valeurs de gravité possibles, consultez Niveau de gravité.
Exemple : mise en majuscules des membres publics
Le fichier .editorconfig suivant contient une convention de nommage qui spécifie que les propriétés publiques, les méthodes, les champs, les événements et les délégués marqués comme readonly
doivent être mis en majuscules. Cette convention de nommage spécifie plusieurs types de symboles auxquels appliquer la règle, en utilisant une virgule pour séparer les valeurs.
[*.{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
Exemple : Champs d’instance privés avec trait de soulignement
Cet extrait de fichier .editorconfig applique le fait que les champs d’instance privée doivent commencer par _
; si cette convention n’est pas suivie, l’IDE traite cela comme une erreur du compilateur. Les champs statiques privés sont ignorés.
Étant donné que vous ne pouvez définir qu’un groupe de symboles en fonction des identificateurs qu’il possède (par exemple, static
ou readonly
), et non par les identificateurs qu’il n’a pas (par exemple, un champ d’instance, car il n’a pas de static
), vous devez définir deux règles de nommage :
- Tous les champs privés,
static
ou non, doivent avoir le style de nommageunderscored
appliqué en tant queerror
du compilateur. - Les champs privés avec
static
doivent avoir le style de nommageunderscored
appliqué avec un niveau de gravité denone
; en d’autres termes, la casse est ignorée.
[*.{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
Cet exemple montre également que les définitions d’entité peuvent être réutilisées. Le style de nommage underscored
est utilisé à la fois par les règles de nommage private_fields_underscored
et private_static_fields_none
.