CA1008: Numaralandırmalar sıfır değerine sahip olmalıdır

Özellik Değer
Kural Kimliği CA1008
Başlık Sabit listelerinin sıfır değeri olmalıdır
Kategori Tasarım
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan - Bayrak olmayan bir None numaralandırmaya değer eklemeniz istendiğinde. Hata: Numaralandırma değerlerini yeniden adlandırmanız veya kaldırmanız istendiğinde.
.NET 8'de varsayılan olarak etkin Hayır

Neden

Uygulanmamış System.FlagsAttribute bir numaralandırma, sıfır değerine sahip bir üye tanımlamaz. Alternatif olarak, uygulanmış FlagsAttribute bir numaralandırma sıfır değerine sahip olan ancak adı 'Yok' olmayan bir üyeyi tanımlar. Sabit listesi birden çok sıfır değerli üye tanımlar.

Varsayılan olarak, bu kural yalnızca dışarıdan görünen numaralandırmalara bakar, ancak bu yapılandırılabilir.

Kural açıklaması

Diğer değer türleri gibi başlatılmamış bir numaralandırmanın varsayılan değeri sıfırdır. Bayrak özniteliği olmayan bir sabit listesi, varsayılan değerin sabit listesi için geçerli bir değer olması için sıfır değerine sahip bir üye tanımlamalıdır. Uygunsa, üyeye 'Yok' (veya izin verilen ek adlardan birini) adlandırın. Aksi takdirde, en sık kullanılan üyeye sıfır atayın. Varsayılan olarak, ilk sabit listesi üyesinin değeri bildirimde ayarlanmadıysa değeri sıfırdır.

Uygulanan bir sabit listesi FlagsAttribute sıfır değerli bir üye tanımlıyorsa, numaralandırmada hiçbir değer ayarlanmadığını belirtmek için adı 'Yok' (veya izin verilen ek adlardan biri) olmalıdır. Başka bir amaç için sıfır değerli üye kullanmak, ve OR bit düzeyinde işleçlerin FlagsAttribute üyeyle bir işe yaramayabilecek AND şekilde kullanılmasına aykırıdır. Bu, yalnızca bir üyeye sıfır değerinin atanması gerektiğini gösterir. Flags özniteliğine sahip bir numaralandırmada sıfır değerine sahip birden çok üye oluşursa, Enum.ToString() sıfır olmayan üyeler için yanlış sonuçlar döndürür.

İhlalleri düzeltme

Bayrak özniteliği olmayan numaralandırmalarda bu kuralın ihlalini düzeltmek için sıfır değerine sahip bir üye tanımlayın; Bu, hataya neden olmayan bir değişikliktir. Sıfır değerli üye tanımlayan bayrak öznitelikli numaralandırmalar için bu üyeye 'Yok' adını verin ve sıfır değerine sahip diğer üyeleri silin; Bu hataya neden olan bir değişikliktir.

Uyarıların ne zaman bastırılması gerekiyor?

Daha önce gönderilen bayrak öznitelikli numaralandırmalar dışında bu kuraldan gelen bir uyarıyı gizlemeyin.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA1008
// The code that's violating the rule is on this line.
#pragma warning restore CA1008

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA1008.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Çözümlemek için kod yapılandırma

Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.

Bu seçeneği yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Tasarım) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

Belirli API yüzeylerini ekleme

Bu kuralın üzerinde çalıştırılacak kod tabanınızın hangi bölümlerini erişilebilirliklerine göre yapılandırabilirsiniz. Örneğin, kuralın yalnızca genel olmayan API yüzeyinde çalıştırılması gerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Ek sıfır değerli alan adları

.NET 7 ve sonraki sürümlerde, sıfır değerli bir sabit listesi alanı için diğer izin verilebilen adları yapılandırabilirsiniz. Bunun yanı sıra None. Birden çok adı karaktere göre | ayırın. Aşağıdaki tabloda bazı örnekler gösterilmektedir.

Seçenek değeri Özet
dotnet_code_quality.CA1008.additional_enum_none_names = Never Hem hem de NoneNever
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing , Neverve izin verir NoneNothing

Örnek

Aşağıdaki örnekte, kuralı karşılayan iki numaralandırma ve kuralı ihlal eden bir numaralandırma BadTraceOptionsgösterilmektedir.

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

Ayrıca bkz.