Megosztás a következőn keresztül:


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 Noneis 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 Nonea , 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, BadTraceOptionsamelyek 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

Lásd még