Aracılığıyla paylaş


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

Ayrıca bkz.

Başvuru

Enum