Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Ö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 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
İlgili kurallar
- CA2217: Sabit listeleri FlagsAttribute ile etiketlemeyin
- CA1700: Sabit liste değerlerini 'Ayrılmış' olarak adlandırmayın
- CA1712: Enum değerlerini tür adıyla önek kullanmayın
- CA1028: Numaralandırma depolaması Int32 olmalıdır
- CA1027: Sabit listeleri FlagsAttribute ile işaretleyin