CA1008: Výčty musí mít nulovou hodnotu
TypeName |
EnumsShouldHaveZeroValue |
CheckId |
CA1008 |
Kategorie |
Microsoft.Design |
Narušující změna |
Nenarušující - je-li vyžadováno přidat hodnotu None do výčtu bez příznaků. Narušující - je-li vyžadováno přejmenovat nebo odstranit kteroukoliv hodnotu výčtu. |
Příčina
Výčet bez použitého atributu System.FlagsAttribute nedefinující člen, který má hodnotu nula, výčet s použitým atributem FlagsAttribute definující člen, který má hodnotu nula, ale její název není ´None´, nebo výčet definující více členů s hodnotou nula.
Popis pravidla
Výchozí hodnota neinicializovaného výčtu, stejně jako u jiných typů hodnot, je nula.Výčet s atributem určujícím, že nemá obsahovat příznaky, byl měl definovat člen s hodnotou nula, aby výchozí hodnota byla platnou hodnotou výčtu.Je-li to vhodné, pojmenujte tento člen ´None´.Jinak přidělte nejčastěji používanému členu hodnotu nula.Povšimněte si, že pokud není hodnota prvního členu výčtu nastavena v deklaraci, je ve výchozím nastavení nula.
Má-li výčet použit atribut FlagsAttribute a definuje člen s hodnotou nula, měl by jeho název být 'None', aby bylo zjevné, že ve výčtu nebyly nastaveny žádné hodnoty.Použití nulového členu pro libovolný jiný účel je v rozporu s použitím atributu FlagsAttribute v tom, že bitové operátory AND a OR postrádají s tímto členem smysl.To znamená, že hodnotu nula by měl mít přiřazenu pouze jeden člen.Povšimněte si, že pokud se ve výčtu s atributem určujícím, že výčet obsahuje příznaky, vyskytne více členů s hodnotou nula, vrací funkce Enum.ToString() pro nenulové členy nesprávné výsledky.
Jak vyřešit porušení
Chcete-li opravit porušení tohoto pravidla u výčtů s atributem určujícím, že výčet neobsahuje příznaky, definujte člen s hodnotou nula; tato změna je nenarušující.Ve výčtech obsahujících příznaky definujících nulový člen pojmenujte tento člen 'None' a odstraňte všechny ostatní členy s hodnotou nula; tato změna je narušující.
Kdy potlačit upozornění
Upozornění tohoto pravidla nepotlačujte, nejde-li o výčet s příznaky, který byl již odeslán.
Příklad
Následující příklad ukazuje dva výčty splňující pravidlo a jeden výčet, BadTraceOptions, který pravidlo porušuje.
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.
}
}
Související pravidla
CA2217: Neoznačovat výčty s FlagsAttribute
CA1700: Není název hodnoty výčtu "Vyhrazené"
CA1712: Není předpona hodnoty výčtu s názvem typu
CA1028: Výčet úložiště by mělo být Int32
CA1027: Značka výčty s FlagsAttribute