CA1008: Az enumerálásnak nulla értékkel kell rendelkeznie
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1008 |
Cím | Az enumerálásnak nulla értékűnek kell lennie |
Kategória | Design |
A javítás kompatibilitástörő vagy nem törik | Nem feltörhető – Amikor a rendszer arra kéri, hogy adjon hozzá egy None értéket egy nem jelölő enumeráláshoz. Kompatibilitástörő – Ha a rendszer arra kéri, hogy nevezze át vagy távolítsa el az enumerálási értékeket. |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
Az alkalmazott System.FlagsAttribute nélküli enumerálás nem definiál nulla értékű tagot. Vagy egy alkalmazott FlagsAttribute enumerálás olyan tagot definiál, amelynek értéke nulla, de neve nem "Nincs". Vagy az enumerálás több, nulla értékű tagot határoz meg.
Alapértelmezés szerint ez a szabály csak külsőleg látható enumerálásokat tekint meg, de ez konfigurálható.
Szabály leírása
A nem inicializált enumerálás alapértelmezett értéke, a többi értéktípushoz hasonlóan nulla. A nem jelölő attribútumú enumerálásnak olyan tagot kell definiálnia, amelynek értéke nulla, így az alapértelmezett érték az enumerálás érvényes értéke. Ha szükséges, nevezze el a "Nincs" tagot (vagy a további engedélyezett nevek egyikét). Ellenkező esetben rendeljen nullát a leggyakrabban használt taghoz. Alapértelmezés szerint ha az első számbavételi tag értéke nincs beállítva a deklarációban, az értéke nulla.
Ha az FlagsAttribute alkalmazott enumerálás nulla értékű tagot határoz meg, a neve "Nincs" (vagy a további engedélyezett nevek egyike) legyen, amely azt jelzi, hogy az enumerálásban nincs érték beállítva. A nulla értékű tagok bármilyen más célra való használata ellentétes azzal, FlagsAttribute hogy a AND
bitenkénti operátorok OR
használhatatlanok a taggal. Ez azt jelenti, hogy csak egy taghoz kell hozzárendelni a nulla értéket. Ha több nulla értékű tag is szerepel egy jelölő attribútumú számbavételben, Enum.ToString()
helytelen eredményeket ad vissza a nem nulla tagoknak.
Szabálysértések kijavítása
Ha meg szeretné oldani a szabály megsértését a nem jelölő attribútumú enumerálások esetében, definiáljon egy nulla értékű tagot; ez egy nem kompatibilitástörő változás. Nulla értékű tagot definiáló jelző attribútumú enumerálások esetén nevezze el ezt a tagot "Nincs" névvel, és törölje a nulla értékű többi tagot; ez egy törés változás.
Mikor kell letiltani a figyelmeztetéseket?
Ne tiltsa le a szabály figyelmeztetését, kivéve a korábban kiszállított jelzők attribútumú enumerálásait.
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA1008
// The code that's violating the rule is on this line.
#pragma warning restore CA1008
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none
a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA1008.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.
Kód konfigurálása elemzéshez
A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezt a beállítást konfigurálhatja csak ehhez a szabályhoz, az összes szabályhoz, vagy az ebben a kategóriában (Tervezés) szereplő összes szabályhoz, amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott API-felületek belefoglalása
A kódbázis azon részeit konfigurálhatja, amelyeken futtathatja ezt a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.api_surface = private, internal
További nulla értékű mezőnevek
A .NET 7 és újabb verzióiban a nulla értékű enumerálási mezők egyéb engedélyezett neveit None
is konfigurálhatja. Több név elválasztása karakter |
szerint. Az alábbi táblázat néhány példát mutat be.
Beállítás értéke | Összegzés |
---|---|
dotnet_code_quality.CA1008.additional_enum_none_names = Never |
None Mindkettőt ésNever |
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing |
Engedélyezi None a , Never és a Nothing |
Példa
Az alábbi példa két olyan enumerálást mutat be, amelyek megfelelnek a szabálynak, és egy enumerálást, BadTraceOptions
amelyek megsértik a szabályt.
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
Kapcsolódó szabályok
- CA2217: Ne jelölje meg a számokat a FlagsAttribute használatával
- CA1700: Ne nevezze el a "Fenntartott" enumerálási értékeket
- CA1712: A típusnévvel rendelkező enumerálási értékek előtagja nem
- CA1028: Az enumerálási tárolónak Int32-nek kell lennie
- CA1027: Számjelek megjelölése FlagsAttribute használatával
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: