CA1008: Enums moet een nulwaarde hebben
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1008 |
Titel | Enums moeten nulwaarde hebben |
Categorie | Ontwerpen |
Oplossing is brekend of niet-brekend | Niet-verbrekend: wanneer u wordt gevraagd een None waarde toe te voegen aan een opsomming zonder vlag. Fouten veroorzaken: wanneer u wordt gevraagd om de naam van opsommingswaarden te wijzigen of te verwijderen. |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een opsomming zonder een toegepaste System.FlagsAttribute opsomming definieert geen lid met een waarde van nul. Of een opsomming die een toegepaste FlagsAttribute waarde heeft, definieert een lid met een waarde van nul, maar de naam is niet 'Geen'. Of de opsomming definieert meerdere leden met een nulwaarde.
Deze regel kijkt standaard alleen naar extern zichtbare opsommingen, maar dit is configureerbaar.
Beschrijving van regel
De standaardwaarde van een niet-geïnitialiseerde opsomming, net als andere waardetypen, is nul. Een opsomming zonder vlaggen moet een lid definiëren dat de waarde nul heeft, zodat de standaardwaarde een geldige waarde van de opsomming is. Geef indien van toepassing de naam 'Geen' (of een van de extra toegestane namen). Wijs anders nul toe aan het meest gebruikte lid. Als de waarde van het eerste opsommingslid niet is ingesteld in de declaratie, is de waarde standaard nul.
Als een opsomming met de FlagsAttribute toegepaste waarde een lid met nulwaarden definieert, moet de naam 'Geen' (of een van de extra toegestane namen) zijn om aan te geven dat er geen waarden zijn ingesteld in de opsomming. Het gebruik van een nulwaardelid voor elk ander doel is in strijd met het gebruik van de FlagsAttribute operatoren AND
en OR
bitsgewijze operatoren zijn nutteloos met het lid. Dit impliceert dat slechts één lid de waarde nul moet krijgen. Als meerdere leden met de waarde nul voorkomen in een opsomming die is toegewezen aan vlaggen, Enum.ToString()
worden onjuiste resultaten geretourneerd voor leden die niet nul zijn.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen voor niet-vlaggen toegeschreven opsommingen, definieert u een lid met de waarde nul; dit is een niet-belangrijke wijziging. Voor markeringen die een lid met nulwaarde definiëren, noemt u dit lid geen en verwijdert u alle andere leden met een waarde nul; dit is een belangrijke wijziging.
Wanneer waarschuwingen onderdrukken
Onderdrukt geen waarschuwing van deze regel, met uitzondering van opsommingen die zijn toegewezen aan vlaggen die eerder zijn verzonden.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA1008
// The code that's violating the rule is on this line.
#pragma warning restore CA1008
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA1008.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Code configureren om te analyseren
Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Specifieke API-oppervlakken opnemen
U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Aanvullende veldnamen met nulwaarden
In .NET 7 en latere versies kunt u andere toegestane namen configureren voor een opsommingsveld met nulwaarden, naast None
. Scheid meerdere namen door het |
teken. In de volgende tabel ziet u enkele voorbeelden.
Optiewaarde | Samenvatting |
---|---|
dotnet_code_quality.CA1008.additional_enum_none_names = Never |
Hiermee staat u zowel als None Never |
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing |
Hiermee staat u None toe, Never en Nothing |
Opmerking
In het volgende voorbeeld ziet u twee opsommingen die voldoen aan de regel en een opsomming, BadTraceOptions
die de regel schendt.
using System;
namespace ca1008
{
public enum TraceLevel
{
Off = 0,
Error = 1,
Warning = 2,
Info = 3,
Verbose = 4
}
[Flags]
public enum TraceOptions
{
None = 0,
CallStack = 0x01,
LogicalStack = 0x02,
DateTime = 0x04,
Timestamp = 0x08,
}
[Flags]
public enum BadTraceOptions
{
CallStack = 0,
LogicalStack = 0x01,
DateTime = 0x02,
Timestamp = 0x04,
}
class UseBadTraceOptions
{
static void MainTrace()
{
// Set the flags.
BadTraceOptions badOptions =
BadTraceOptions.LogicalStack | BadTraceOptions.Timestamp;
// Check whether CallStack is set.
if ((badOptions & BadTraceOptions.CallStack) ==
BadTraceOptions.CallStack)
{
// This 'if' statement is always true.
}
}
}
}
Imports System
Namespace ca1008
Public Enum TraceLevel
Off = 0
AnError = 1
Warning = 2
Info = 3
Verbose = 4
End Enum
<Flags>
Public Enum TraceOptions
None = 0
CallStack = &H1
LogicalStack = &H2
DateTime = &H4
Timestamp = &H8
End Enum
<Flags>
Public Enum BadTraceOptions
CallStack = 0
LogicalStack = &H1
DateTime = &H2
Timestamp = &H4
End Enum
Class UseBadTraceOptions
Shared Sub Main1008()
' Set the flags.
Dim badOptions As BadTraceOptions =
BadTraceOptions.LogicalStack Or BadTraceOptions.Timestamp
' Check whether CallStack is set.
If ((badOptions And BadTraceOptions.CallStack) =
BadTraceOptions.CallStack) Then
' This 'If' statement is always true.
End If
End Sub
End Class
End Namespace
Gerelateerde regels
- CA2217: Opsommingen niet markeren met FlagsAttribute
- CA1700: Geef geen opsommingswaarden 'Gereserveerd' op
- CA1712: Geen voorvoegsel enumwaarden met typenaam
- CA1028: Enum-opslag moet Int32 zijn
- CA1027: Opsommingen markeren met FlagsAttribute