共用方式為


CA1008:列舉值中應該要有值為零的成員

型別名稱

EnumsShouldHaveZeroValue

CheckId

CA1008

分類

Microsoft.Design

中斷變更

非中斷 - 當提示您要將 None 值加入至沒有旗標的列舉時。中斷 - 當提示您要重新命名或移除任何列舉值時。

原因

未套用 FlagsAttribute 的列舉不定義含零值的成員;已套用 FlagsAttribute 的列舉會定義含零值但名稱不為 'None' 的成員,或是列舉會定義多個值為零的成員。

規則描述

就像其他實值型別一樣,未初始化的列舉其預設值為零。非旗標屬性的列舉應該要定義含有零值的成員,使列舉可以指定有效的預設值。如果合適,請將零值的成員命名為 'None'。否則,請指派零給最常用的成員。請注意,如果未在宣告中設定第一個列舉成員的值,其值預設為零。

如果在已套用 FlagsAttribute 的列舉型別中定義零值成員,則其名稱應該是 'None',以做為使用列舉型別並且未設定任何值時的預設值。基於任何其他目的,使用零值成員會與 FlagsAttribute 的用法相反,所以零值成員與 AND 和 OR 位元 (Bitwise) 運算子無法同時與其他成員一起使用。這意味著只應該指派零值給一個成員。請注意,如果在旗標屬性列舉中有多個成員具有零值,則 Enum.ToString() 將針對不是零的成員傳回不正確的結果。

如何修正違規

若要對非旗標屬性列舉修正此規則的違規情形,請定義含有零值的成員。這是非中斷變更。對於定義零值成員的旗標屬性列舉,將這個成員命名為 'None',然後刪除任何其他含有零值的成員,這是需要中斷的變更。

隱藏警告的時機

除了先前所提供的旗標屬性列舉型別之外,請勿隱藏這項規則的警告。

範例

下列範例會顯示兩個滿足規則的列舉,以及一個違反規則的列舉 (BadTraceOptions)。

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.
   }
}

相關規則

CA2217:不要以 FlagsAttribute 標記列舉

CA1700:不要在列舉值名稱中包含 'Reserved'

CA1712:不要使用類型名稱做為列舉值的前置字元

CA1028:列舉儲存區應該是 Int32

CA1027:必須以 FlagsAttribute 標記列舉

請參閱

參考

Enum