CA1008: Numaralandırmalar sıfır değerine sahip olmalıdır
TürAdı |
SıralamalarSıfırDeğereSahipOlmalıdır |
CheckId |
CA1008 |
Kategori |
Microsoft.Design |
Bozan Değişiklik |
Yeni olmayan - İşaretlenmemiş bir sıralamaya bir Hiçbiri değeri ekleme isteminde bulunduğunuzda. Yeni - herhangi bir sıralama değerini yeniden adlandırma veya kadırma istemi bulunduğunuzda. |
Sebep
Uygulanmış bir FlagsAttribute olmayan bir sıralama sıfır değeri olan bir üyeyi tanımlamaz; veya uygulanmış bir FlagsAttribute 'a sahip olan bir sıralama sıfır değeri olan bir üyeyi tanımlar ama adı 'Hiçbiri' değildir veya sıralama birden fazla sıfır değerli üye tanımlar.
Kural Tanımı
Tıpkı diğer türler gibi başlatılmamış bir numaralandırmanın varsayılan değeri sıfırdır.İşaretlenmemiş bir geçerli numaralama varsayılan değerin geçerli bir numaralandırma değeri olması için değeri sıfır olan bir üye tanımlaması gerekir.Uygunsa, üye adına 'Hiçbiri' verir.Aksi takdirde, en sık kullanılan üyeyi sıfıra atayın.İlk numaralandırma üyesi değeri bildiriminde ayarlanmazsa varsayılan olarak sıfır olduğunu unutmayın.
Eğer uygulanmış FlagsAttribute 'a sahip bir numaralandırma sıfır değerli bir üye tanımlar ise, numaralandırmada değerinin atanmadığını göstermek için adı 'Hiçbiri' olmalıdır.Ve ve Veya bitsel işlemcileri üye ile birlikte elverişsiz olduğunda FlagsAttribute kullanımı sıfır değerli bir üyenin herhangi bir amaç için kullanılmasına zıttır.Bu tek bir üyenin sıfır değere atanmış olması gerektiği anlamına gelir.Birden fazla üye bir işaret nitelikli numaralandırmada sıfır değerine sahip ise, Enum.ToString() sıfır olmayan üyeleri için yanlış sonuçlar döndürür.
İhlallerin Düzeltilmesi
İşaretsiz nitelikli numaralandırma için bu kural ihlalini düzeltmek için, değeri sıfır olan bir üye tanımlayın; bu, yeni olmayan bir değişimdir.İşaret nitelikli sıfır değerli üyeler tanımlayan numaralandırmalar için, bu üyenin adını 'Hiçbiri' verin ve sıfır değeri olan diğer tüm üyeleri silin; bu yeni bir değişikliktir.
Uyarılar Ne Zaman Bastırılmalı
Daha önce taşınan işaret nitelikli numaralandırmalar hariç bu kuraldan gelen bir uyarıyı baskılamayın.
Örnek
Kurala uyan iki numaralandırma ve kuralı ihlal eden bir numaralandırma, BadTraceOptions, aşağıdaki örnekte gösterilmektedir.
Imports System
Namespace DesignLibrary
Public Enum TraceLevel
Off = 0
AnError = 1
Warning = 2
Info = 3
Verbose = 4
End Enum
<Flags> _
Public Enum TraceOptions
None = 0
CallStack = &H01
LogicalStack = &H02
DateTime = &H04
Timestamp = &H08
End Enum
<Flags> _
Public Enum BadTraceOptions
CallStack = 0
LogicalStack = &H01
DateTime = &H02
Timestamp = &H04
End Enum
Class UseBadTraceOptions
Shared Sub Main()
' Set the flags.
Dim badOptions As BadTraceOptions = _
BadTraceOptions.LogicalStack Or BadTraceOptions.Timestamp
' Check whether CallStack is set.
If((badOptions And BadTraceOptions.CallStack) = _
BadTraceOptions.CallStack)
' This 'If' statement is always true.
End If
End Sub
End Class
End Namespace
using System;
namespace DesignLibrary
{
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 Main()
{
// 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.
}
}
}
}
using namespace System;
namespace DesignLibrary
{
public enum class TraceLevel
{
Off = 0,
Error = 1,
Warning = 2,
Info = 3,
Verbose = 4
};
[Flags]
public enum class TraceOptions
{
None = 0,
CallStack = 0x01,
LogicalStack = 0x02,
DateTime = 0x04,
Timestamp = 0x08
};
[Flags]
public enum class BadTraceOptions
{
CallStack = 0,
LogicalStack = 0x01,
DateTime = 0x02,
Timestamp = 0x04
};
}
using namespace DesignLibrary;
void main()
{
// Set the flags.
BadTraceOptions badOptions = safe_cast<BadTraceOptions>
(BadTraceOptions::LogicalStack | BadTraceOptions::Timestamp);
// Check whether CallStack is set.
if((badOptions & BadTraceOptions::CallStack) ==
BadTraceOptions::CallStack)
{
// This 'if' statement is always true.
}
}
İ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şaretle