CA1008: Wyliczenia powinny mieć wartość zero
TypeName |
EnumsShouldHaveZeroValue |
CheckId |
CA1008 |
Kategoria |
Microsoft.Design |
Zmiana kluczowa |
Niekluczowa - po wyświetleniu monitu, aby dodać wartość Brak do wyliczenia bez flagi. Kluczowa - po wyświetleniu monitu, aby zmienić nazwę lub usunąć wszystkie wartości z wyliczenia. |
Przyczyna
Wyliczenie bez zastosowanego FlagsAttribute nie definiuje elementu członkowskiego, który posiada wartość zero; lub wyliczenie, które stosuje FlagsAttribute definiuje element członkowski, który posiada wartość zero, ale o nazwie innej niż 'Brak'; lub też wyliczanie definiuje wiele elementów członkowskich o wartości zero.
Opis reguły
Wartość domyślna niezainicjowanego typu wyliczeniowego, podobnie jak inne typy wartości wynosi zero.Wyliczenie non-flags-attributed powinno definiować element członkowski, który posiada wartość zero, tak aby wartość domyślna była prawidłową wartością wyliczenia.Jeśli jest to poprawne, należy zmienić nazwę elementu członkowskiego na 'Brak'.W przeciwnym razie należy przypisać zero do najczęściej używanego elementu członkowskiego.Należy zauważyć, że domyślnie, jeśli nie ustawiono wartości pierwszego elementu członkowskiego wyliczenia w deklaracji, jego wartość wynosi zero.
Jeśli wyliczenie, które posiada zastosowany FlagsAttribute definiuje niezerowy element członkowski, powinno mieć nazwę "Brak", aby wskazywać na brak ustawionych wartości w wyliczeniu.Używanie niezerowych elementów członkowskich dla innych celów jest sprzeczne z użyciem FlagsAttribute i powoduje, że operatory bitowe AND oraz OR są bezużyteczne w ramach elementu członkowskiego.Oznacza to, że tylko jeden element członkowski powinien mieć przypisaną wartość zero.Uwaga, jeśli w wyliczeniu flags-attributed wystąpi wiele elementów członkowskich mających wartość zero Enum.ToString() zwróci nieprawidłowe wyniki dla niezerowych elementów członkowskich.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady dla wyliczeń non-flags−attributed należy zdefiniować element członkowski, który ma wartość zero; jest to zmiana niekluczowa.Dla wyliczeń flags-attributed definiujących zerowe elementy członkowskie, należy zmienić nazwę tego elementu członkowskiego na 'Brak' oraz usunąć pozostałe elementy członkowskie, które posiadają wartość zero; jest to zmiana kluczowa.
Kiedy pominąć ostrzeżenia
Nie pomijaj ostrzeżeń dotyczących tej reguły, z wyjątkiem wyliczeń flags-attributed, które zostały poprzednio wysłane.
Przykład
Poniższy przykład ilustruje dwa wyliczenia, które spełniają regułę oraz wyliczenie, BadTraceOptions, które narusza regułę.
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.
}
}
Powiązane reguły
CA2217: Nie oznaczaj wyliczeń za pomocą FlagsAttribute
CA1700: Nie należy nadawać wartościom enum oznaczenia „Reserved"
CA1712: Nie należy poprzedzać wartości enum nazwą typu
CA1028: Pamięć wyliczenia powinna być Int32
CA1027: Oznaczaj wyliczenia za pomocą FlagsAttribute