Reguły nazewnictwa stylu kodu
W pliku .editorconfig można zdefiniować konwencje nazewnictwa dla elementów kodu języka programowania .NET, takich jak klasy, właściwości i metody , oraz sposób wymuszania tych konwencji przez kompilator lub środowisko IDE. Można na przykład określić, że publiczny element członkowski, który nie jest kapitalizowany, powinien być traktowany jako błąd kompilatora lub jeśli pole prywatne nie zaczyna się od _
, powinno zostać wyświetlone ostrzeżenie kompilacji.
W szczególności można zdefiniować regułę nazewnictwa, która składa się z trzech części:
- Grupa symboli, która ma zastosowanie do na przykład publicznych elementów członkowskich lub pól prywatnych.
- Styl nazewnictwa do skojarzenia z regułą, na przykład, że nazwa musi być wielkich liter lub zaczynać się od podkreślenia.
- Poziom ważności komunikatu, gdy elementy kodu zawarte w grupie symboli nie są zgodne ze stylem nazewnictwa.
Składnia ogólna
Aby zdefiniować dowolną z powyższych jednostek — regułę nazewnictwa, grupę symboli lub styl nazewnictwa — ustaw co najmniej jedną właściwość przy użyciu następującej składni:
<kind>.<entityName>.<propertyName> = <propertyValue>
Wszystkie ustawienia właściwości dla danej kind
jednostki i entityName
składają się na daną definicję jednostki.
Każda właściwość powinna być ustawiana tylko raz, ale niektóre ustawienia zezwalają na wiele wartości rozdzielanych przecinkami.
Kolejność właściwości nie jest ważna.
<wartości kind>
<kind> określa, jaki rodzaj jednostki jest definiowany — reguła nazewnictwa, grupa symboli lub styl nazewnictwa — i musi być jednym z następujących elementów:
Aby ustawić właściwość dla | <Użyj wartości rodzaju> | Przykład |
---|---|---|
Reguła nazewnictwa | dotnet_naming_rule |
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion |
Grupa symboli | dotnet_naming_symbols |
dotnet_naming_symbols.interface.applicable_kinds = interface |
Styl nazewnictwa | dotnet_naming_style |
dotnet_naming_style.pascal_case.capitalization = pascal_case |
<entityName>
<entityName> to opisowa nazwa, która kojarzy wiele ustawień właściwości z pojedynczą definicją. Na przykład następujące właściwości tworzą dwie definicje grup symboli i interface
types
, z których każda ma dwie właściwości ustawione.
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> i <propertyValue>
Każdy rodzaj jednostki — reguła nazewnictwa, grupa symboli lub styl nazewnictwa — ma własne obsługiwane właściwości, zgodnie z opisem w poniższych sekcjach.
Właściwości grupy symboli
Możesz ustawić następujące właściwości dla grup symboli, aby ograniczyć, które symbole są zawarte w grupie. Aby określić wiele wartości dla jednej właściwości, należy oddzielić wartości przecinkami.
Właściwości | opis | Dozwolone wartości | Wymagania |
---|---|---|---|
applicable_kinds |
Rodzaje symboli w grupie 1 | * (użyj tej wartości, aby określić wszystkie symbole)namespace class struct interface enum property method field event delegate parameter type_parameter local local_function |
Tak |
applicable_accessibilities |
Poziomy ułatwień dostępu symboli w grupie | * (użyj tej wartości, aby określić wszystkie poziomy ułatwień dostępu)public internal lub friend private protected protected_internal lub protected_friend private_protected local (dla symboli zdefiniowanych w metodzie) |
Tak |
required_modifiers |
Dopasowuje tylko symbole ze wszystkimi określonymi modyfikatorami 2 | abstract lub must_inherit async const readonly static lub shared 3 |
Nie. |
Uwagi:
- Członkowie krotki nie są obecnie obsługiwane w systemie
applicable_kinds
. - Grupa symboli pasuje do wszystkich modyfikatorów we
required_modifiers
właściwości . Jeśli pominiesz tę właściwość, dla dopasowania nie są wymagane żadne określone modyfikatory. Oznacza to, że modyfikatory symboli nie mają wpływu na to, czy ta reguła jest stosowana. - Jeśli grupa ma
static
właściwość lubshared
wrequired_modifiers
niej, grupa będzie również zawieraćconst
symbole, ponieważ są niejawniestatic
/Shared
. Jeśli jednak nie chcesz, aby regułastatic
nazewnictwa miała być stosowana doconst
symboli, możesz utworzyć nową regułę nazewnictwa z grupą symboliconst
. Nowa reguła będzie mieć pierwszeństwo zgodnie z kolejnością reguł. class
zawiera rekordy języka C#.
Właściwości stylu nazewnictwa
Styl nazewnictwa definiuje konwencje, które mają być wymuszane za pomocą reguły. Na przykład:
- Wielką literą za pomocą polecenia
PascalCase
- Rozpoczyna się od
m_
- Kończy się na
_g
- Oddzielanie wyrazów z
__
Dla stylu nazewnictwa można ustawić następujące właściwości:
Właściwości | opis | Dozwolone wartości | Wymagania |
---|---|---|---|
capitalization |
Styl wielkich liter dla wyrazów w symbolu | pascal_case camel_case first_word_upper all_upper all_lower |
Tak1 |
required_prefix |
Musi zaczynać się od tych znaków | Nie. | |
required_suffix |
Musi kończyć się tymi znakami | Nie. | |
word_separator |
Wyrazy w symbolu muszą być oddzielone tym znakiem | Nie. |
Uwagi:
- Musisz określić styl wielkich liter w ramach stylu nazewnictwa. W przeciwnym razie styl nazewnictwa może być ignorowany.
Właściwości reguły nazewnictwa
Wszystkie właściwości reguły nazewnictwa są wymagane, aby reguła weszła w życie.
Właściwości | opis |
---|---|
symbols |
Nazwa grupy symboli zdefiniowanej gdzie indziej; reguła nazewnictwa zostanie zastosowana do symboli w tej grupie |
style |
Nazwa stylu nazewnictwa, który powinien być skojarzony z tą regułą; styl jest definiowany gdzie indziej |
severity |
Ustawia ważność, za pomocą której ma być wymuszana reguła nazewnictwa. Ustaw skojarzona wartość na jeden z dostępnych poziomów ważności.1 |
Uwagi:
- Specyfikacja ważności w regule nazewnictwa jest uwzględniana tylko wewnątrz środowisk IDE programowania, takich jak Visual Studio. To ustawienie nie jest zrozumiałe dla kompilatorów języka C# ani VB, dlatego nie jest uwzględniane podczas kompilacji. Aby wymusić reguły stylu nazewnictwa w kompilacji, należy zamiast tego ustawić ważność przy użyciu konfiguracji ważności reguły kodu. Aby uzyskać więcej informacji, zobacz ten problem w serwisie GitHub.
Kolejność reguł
Kolejność, w jakiej reguły nazewnictwa są zdefiniowane w pliku EditorConfig, nie ma znaczenia. Reguły nazewnictwa są automatycznie uporządkowane zgodnie z definicjami reguł. Bardziej szczegółowe reguły dotyczące dostępu, modyfikatorów i symboli mają pierwszeństwo przed mniej specyficznymi regułami. Jeśli reguły nakładają się na siebie lub jeśli kolejność reguł powoduje problemy, można podzielić skrzyżowanie tych dwóch reguł na nową regułę, która ma pierwszeństwo przed szerszymi regułami, z których została utworzona. Aby zapoznać się z przykładami, zobacz Przykład: Nakładające się strategie nazewnictwa i Przykład: const
modyfikator zawiera static
i readonly
.
Rozszerzenie EditorConfig Language Service może analizować plik EditorConfig i przypadki raportów, w których kolejność reguł w pliku różni się od tego, co kompilator będzie używać w czasie wykonywania.
Uwaga
Jeśli używasz wersji programu Visual Studio starszej niż Visual Studio 2019, reguły nazewnictwa powinny być uporządkowane od najbardziej specyficznych dla najmniej specyficznych dla pliku EditorConfig. Pierwsza napotkana reguła, którą można zastosować, to jedyna zastosowana reguła. Jeśli jednak istnieje wiele właściwości reguły o tej samej nazwie, ostatnio znaleziona właściwość o tej nazwie ma pierwszeństwo. Aby uzyskać więcej informacji, zobacz Hierarchia plików i pierwszeństwo.
Przykład: Nakładające się strategie nazewnictwa
Rozważ następujące dwie reguły nazewnictwa:
- Metody publiczne to PascalCase.
- Metody asynchroniczne kończą się ciągiem
"Async"
.
W przypadku public async
metod nie jest oczywiste, która reguła ma pierwszeństwo. Możesz utworzyć nową regułę dla public async
metod i określić dokładnie nazewnictwo.
Przykład: const
modyfikator zawiera static
i readonly
Rozważ następujące dwie reguły nazewnictwa:
- Pola stałe to PascalCase.
- Pola inne niż publiczne
static
są s_camelCase.
Reguła 2 jest bardziej szczegółowa i ma pierwszeństwo, więc wszystkie pola niepubliczne są s_camelCase. Aby rozwiązać ten problem, możesz zdefiniować regułę przecięcia: pola niepubliczne stałe to PascalCase.
Domyślne style nazewnictwa
Jeśli nie określisz żadnych niestandardowych reguł nazewnictwa, zostaną użyte następujące style domyślne:
W przypadku klas, struktur, wyliczenia, właściwości, metod i zdarzeń z dowolnymi ułatwieniami dostępu domyślnym stylem nazewnictwa jest przypadek Pascal.
W przypadku interfejsów z dowolnymi ułatwieniami dostępu domyślnym stylem nazewnictwa jest przypadek Pascal z wymaganym prefiksem I.
Identyfikator reguły kodu: IDE1006 (Naming rule violation)
Wszystkie opcje nazewnictwa mają identyfikator IDE1006
reguły i tytuł Naming rule violation
. Ważność naruszeń nazewnictwa można skonfigurować globalnie w pliku EditorConfig o następującej składni:
dotnet_diagnostic.IDE1006.severity = <severity value>
Wartość ważności musi być warning
wymuszana na kompilacji lub error
musi być wymuszana. Aby uzyskać wszystkie możliwe wartości ważności, zobacz poziom ważności.
Przykład: kapitalizowanie publicznych składowych
Poniższy plik .editorconfig zawiera konwencję nazewnictwa określającą, że właściwości publiczne, metody, pola, zdarzenia i delegaty, które są oznaczone readonly
, muszą być wielkich liter. Ta konwencja nazewnictwa określa wiele rodzajów symboli, aby zastosować regułę, używając przecinka w celu oddzielenia wartości.
[*.{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
Przykład: pola wystąpienia prywatnego z podkreśleniami
Ten fragment pliku .editorconfig wymusza, że pola wystąpienia prywatnego powinny zaczynać się od elementu _
. Jeśli ta konwencja nie jest zgodna, środowisko IDE będzie traktować je jako błąd kompilatora. Prywatne pola statyczne są ignorowane.
Ponieważ można zdefiniować grupę symboli tylko na podstawie identyfikatorów, które ma (na przykład static
lub readonly
), a nie według identyfikatorów, których nie ma (na przykład pola wystąpienia, ponieważ nie ma static
), należy zdefiniować dwie reguły nazewnictwa:
- Wszystkie pola prywatne —
static
lub nie — powinny miećunderscored
zastosowany styl nazewnictwa jako kompilatorerror
. - Pola prywatne z
static
powinny miećunderscored
zastosowany styl nazewnictwa z poziomemnone
ważności ; innymi słowy, ignoruj ten przypadek.
[*.{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
W tym przykładzie pokazano również, że definicje jednostek można użyć ponownie. Styl underscored
nazewnictwa jest używany zarówno private_fields_underscored
przez reguły nazewnictwa, jak i private_static_fields_none
.