Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA1508 |
| Tytuł | Unikaj martwego kodu warunku |
| Kategoria | Łatwość konserwacji |
| Poprawka łamiąca lub nienaruszająca | Niełamliwy |
| Domyślnie włączone na platformie .NET 10 | Nie. |
| Zastosowane języki | C# i Visual Basic |
Przyczyna
Metoda ma kod warunkowy, który zawsze ocenia wartość true lub false w czasie wykonywania. Prowadzi to do martwego kodu w false gałęzi warunku.
Domyślnie ta reguła analizuje całą bazę kodu, ale można to skonfigurować.
Opis reguły
Metody mogą mieć kod warunkowy, taki jak instrukcje if, wyrażenia binarne (==, !=, <, >), kontrole null itp. Rozważmy na przykład następujący kod:
public void M(int i, int j)
{
if (i != 0)
{
return;
}
if (j != 0)
{
return;
}
// Below condition will always evaluate to 'false' as 'i' and 'j' are both '0' here.
if (i != j)
{
// Code in this 'if' branch is dead code.
// It can either be removed or refactored.
...
}
}
Kompilatory języka C# i VB przeprowadzają analizę testów warunkowych obejmujących wartości stałe określane w czasie kompilacji, które zawsze oceniają się jako prawda lub fałsz. Ten analizator wykonuje analizę przepływu danych zmiennych niestałych w celu określenia nadmiarowych kontroli warunkowych obejmujących wartości niestałych. W poprzednim kodzie analizator określa, że i i j są 0 dla wszystkich ścieżek kodu, które prowadzą do sprawdzenia i != j. W związku z tym to sprawdzenie zawsze da rezultat false w czasie wykonywania. Kod wewnątrz instrukcji if jest martwy i można go usunąć lub refaktoryzować. Podobnie analizator śledzi nullowalność zmiennych i zgłasza nadmiarowe sprawdzenia null.
Uwaga
Ten analizator wykonuje kosztowną analizę przepływu danych wartości niestałych. Może to zwiększyć ogólny czas kompilacji w niektórych bazach kodu.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć naruszenie tej reguły, jeśli nie martwisz się o konserwację kodu. Można również pominąć naruszenia, które są identyfikowane jako fałszywie dodatnie. Jest to możliwe w obecności współbieżnego kodu, który może być wykonywany z wielu wątków.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1508
// The code that's violating the rule is on this line.
#pragma warning restore CA1508
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1508.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Konfigurowanie kodu do analizowania
Użyj poniższych opcji, aby skonfigurować, na które części bazy kodu ma być stosowana ta reguła.
Ponadto do tej reguły mają zastosowanie następujące opcje związane z analizą przepływu danych:
- rodzaj_interproceduralnej_analizy
- max_interprocedural_lambda_or_local_function_call_chain
- max_interprocedural_method_call_chain
- points_to_analysis_kind
- analiza_kopii
- sufficient_IterationCount_for_weak_KDF_algorithm
Możesz skonfigurować te opcje tylko dla tej reguły, dla wszystkich reguł, do których mają zastosowanie, lub dla wszystkich reguł w tej kategorii (możliwości konserwacji), do których mają zastosowanie. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Wyklucz określone symbole
Z analizy można wykluczyć określone symbole, takie jak typy i metody, ustawiając opcję excluded_symbol_names. Aby na przykład określić, że reguła nie powinna być uruchamiana w żadnym kodzie w typach o nazwie MyType, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Uwaga
Zastąp część XXXXCAXXXX identyfikatorem odpowiedniej reguły.
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |):
- Tylko nazwa symbolu (zawiera wszystkie symbole o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu. Każda nazwa symbolu wymaga prefiksu określającego rodzaj symbolu, takiego jak
M:dla metody,T:dla typów iN:dla przestrzeni nazw. -
.ctordla konstruktorów i.cctordla konstruktorów statycznych.
Przykłady:
| Wartość opcji | Podsumowanie |
|---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Pasuje do wszystkich symboli o nazwie MyType. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Pasuje do wszystkich symboli o nazwie MyType1 lub MyType2. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Dopasowuje określoną metodę MyMethod do określonej, w pełni kwalifikowanej sygnatury. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Dopasowuje określone metody MyMethod1 i MyMethod2 z odpowiednimi w pełni kwalifikowanymi sygnaturami. |
Wyklucz określone typy i ich pochodne typy
Określone typy i ich typy pochodne można wykluczyć z analizy, ustawiając opcję excluded_type_names_with_derived_types. Aby na przykład określić, że reguła nie powinna być uruchamiana na żadnych metodach w typach nazwanych MyType i ich typach pochodnych, dodaj następującą parę klucz-wartość do pliku .editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Uwaga
Zastąp część XXXXCAXXXX identyfikatorem odpowiedniej reguły.
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |):
- Podaj tylko nazwę typu (obejmuje wszystkie typy o tej nazwie, bez względu na typ zawierający lub przestrzeń nazw).
- W pełni kwalifikowane nazwy w formacie dokumentacyjnego identyfikatora symbolu, z opcjonalnym prefiksem
T:.
Przykłady:
| Wartość opcji | Podsumowanie |
|---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Pasuje do wszystkich typów nazwanych MyType i wszystkich ich typów pochodnych. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Dopasuje wszystkie typy o nazwie MyType1 lub MyType2 i wszystkie ich typy pochodne. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Dopasowuje określony typ MyType do danej w pełni kwalifikowanej nazwy i do wszystkich jego pochodnych typów. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Pasuje do określonych typów MyType1 i MyType2 z odpowiednimi w pełni kwalifikowanymi nazwami i wszystkimi ich typami pochodnymi. |