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

Özellik Değer
Kural Kimliği CA1008
Başlık enumlar sıfır değerine sahip olmalıdır
Kategori Tasarım
Düzeltme bozucu ya da bozmayan olabilir Hataya neden olmayan - Bayrak olmayan bir None numaralandırmaya değer eklemeniz istendiğinde. Uyarı: Numaralandırma değerlerini yeniden adlandırmanız veya kaldırmanız istendiğinde.
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

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. Ya da 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 sıralama üyesinin değeri bildirimde ayarlanmadıysa sıfırdır.

Uygulandığında, bir numaralandırma sıfır değerli bir üye tanımlıyorsa, numaralandırmada hiçbir değer ayarlanmadığını belirtmek için adının 'Yok' (veya izin verilen ek adlardan biri) olması gerekir. Sıfır değerli bir üyeyi başka bir amaç için kullanmak, FlagsAttribute kullanım amacına aykırıdır, çünkü AND ve OR bit düzeyinde işleçler bu üyeyle kullanılmak için anlamsız hale gelir. 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 bir ü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, mevcut işlevselliği bozabilecek bir değişikliktir.

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

Daha önce yayınlanan 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.

Kod çözümleme için konfigüre et

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çenekleri yalnızca bu kural için, uyguladıkları tüm kurallar için veya bu kategorideki tüm kurallar için (Tasarım) yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

Belirli API yüzeylerini ekleme

api_surface seçeneğini ayarlayarak, bu kuralın erişilebilirliği temelinde kod tabanınızın hangi bölümlerinde çalıştırılacaklarını 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

Not

XXXX CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.

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

.NET 7 ve sonraki sürümlerde, None dışında sıfır değerli bir sabit listesi alanı için kabul edilebilir diğer adları yapılandırabilirsiniz. Birden çok adı | karakteri ile 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 None ve Never
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing None, Never, ve Nothing 'ye izin verir

Ö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.