CA1508: Undvik död villkorlig kod
Property | Värde |
---|---|
Regel-ID | CA1508 |
Title | Undvik död villkorlig kod |
Kategori | Underhåll |
Korrigeringen är icke-bakåtkompatibel | Icke-breaking |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En metod har villkorsstyrd kod som alltid utvärderas till true
eller false
vid körning. Detta leder till död kod i grenen false
av villkoret.
Som standard analyserar den här regeln hela kodbasen, men detta kan konfigureras.
Regelbeskrivning
Metoder kan ha villkorsstyrd kod, till exempel om -uttryck, binära uttryck (==
, , !=
<
, >
), null-kontroller osv. Tänk till exempel på följande 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.
...
}
}
C#- och VB-kompilatorer utför analys av villkorsstyrda kontroller med konstanta kompileringsvärden som alltid utvärderas till true
eller false
. Den här analysatorn utför dataflödesanalys av icke-konstanta variabler för att fastställa redundanta villkorliga kontroller som involverar icke-konstanta värden. I föregående kod bestämmer analysatorn det i
och är båda 0
för alla kodsökvägar som når i != j
j
kontrollen. Därför utvärderas den här kontrollen alltid till false
vid körning. Koden i if-instruktionen är dödkod och kan tas bort eller omstruktureras. På samma sätt spårar analysatorn nulliteten för variabler och rapporterar redundanta null-kontroller.
Kommentar
Den här analysatorn utför en dyr dataflödesanalys av icke-konstanta värden. Detta kan öka den totala kompileringstiden för vissa kodbaser.
När du ska ignorera varningar
Det är säkert att förhindra en överträdelse av den här regeln om du inte bryr dig om kodens underhållbarhet. Det är också bra att förhindra överträdelser som identifieras som falska positiva identifieringar. Dessa är möjliga i närvaro av samtidig kod som kan köras från flera trådar.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA1508
// The code that's violating the rule is on this line.
#pragma warning restore CA1508
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA1508.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera dessa alternativ för just den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (underhållbarhet) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Exkludera specifika symboler
Du kan exkludera specifika symboler, till exempel typer och metoder, från analys. Om du till exempel vill ange att regeln inte ska köras på någon kod inom typer med namnet MyType
lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Endast symbolnamn (innehåller alla symboler med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format. Varje symbolnamn kräver ett symboltypprefix, till exempel
M:
för metoder,T:
för typer ochN:
för namnområden. .ctor
för konstruktorer och.cctor
statiska konstruktorer.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Matchar alla symboler med namnet MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Matchar alla symboler med namnet antingen MyType1 eller MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Matchar en specifik metod MyMethod med den angivna fullständigt kvalificerade signaturen. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Matchar specifika metoder MyMethod1 och MyMethod2 med respektive fullständigt kvalificerade signaturer. |
Exkludera specifika typer och deras härledda typer
Du kan exkludera specifika typer och deras härledda typer från analys. Om du till exempel vill ange att regeln inte ska köras på några metoder inom typer som heter MyType
och deras härledda typer lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Skriv endast namn (innehåller alla typer med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt
T:
prefix.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Matchar alla typer med namnet MyType och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Matchar alla typer med namnet antingen MyType1 eller MyType2 och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Matchar en specifik typ MyType med ett angivet fullständigt kvalificerat namn och alla dess härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Matchar specifika typer MyType1 och MyType2 med respektive fullständigt kvalificerade namn och alla deras härledda typer. |