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 none
olarak 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 None Never |
dotnet_code_quality.CA1008.additional_enum_none_names = Never|Nothing |
, Never ve izin verir None Nothing |
Örnek
Aşağıdaki örnekte, kuralı karşılayan iki numaralandırma ve kuralı ihlal eden bir numaralandırma BadTraceOptions
gö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
İlgili kurallar
- CA2217: Numaralandırmaları FlagsAttribute ile işaretlemeyin
- CA1700: Numaralandırma değerlerini 'Ayrılmış' olarak adlandırmayın
- CA1712: Numaralandırma değerleri için tür adıyla önek kullanmayın
- CA1028: Numaralandırma depolaması Int32 olmalıdır
- CA1027: Numaralandırmaları FlagsAttribute ile işaretleyin