2012-02-21 143 views
0

我有以下代碼:FlagsAttribute Enum在C#中的行爲是什麼?

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
     [FlagsAttribute] 
     private enum RenderType 
     { 
      DataUri = 0, 
      GZip = 1, 
      ContentPage = 2, 
      ViewPage = 4, 
      HomePage = 8 
     } 

     private static void Main() 
     { 

      // 4. 
      // Set a new enum in three statements. 
      RenderType type2 = RenderType.ViewPage; 
      // 5. 
      // See if the enum contains this flag. 
      if ((type2 & RenderType.ViewPage) == RenderType.ViewPage) 
      { 
       Console.WriteLine("ViewPage"); 
      } 

      if ((type2 & RenderType.DataUri) == RenderType.DataUri) 
      { 
       Console.WriteLine("DataUri"); 
      } 
      if ((type2 & RenderType.GZip) == RenderType.GZip) 
      { 
       Console.WriteLine("GZip"); 
      } 

     } 
    } 

} 

每當我運行此代碼,它給我的輸出:

的ViewPage DataUri

我只想的ViewPage的輸出,因爲我給值給我的枚舉ViewPage。

任何人都可以幫助我嗎?爲什麼是這樣?我的Enum聲明或代碼有什麼問題嗎?

+0

小澄清:其實,有沒有** * * C#中[Flags]的特定行爲 - 它的行爲與任何'enum'(或整數)完全相同。 ** BCL **有一些'[Flags]'處理(例如序列化),就像一些IDE工具一樣。但*語言*:不關心'[Flags]'的一個iota。 – 2012-02-21 09:28:17

回答

0

因爲x & 0總是等於零。

4

您已經聲明DataUri = 0所以

(type2 & RenderType.DataUri) == RenderType.DataUri 

將始終評估爲true

在1

1

DataUri啓動有效的枚舉值是0:所以x & DataUri始終爲零! 嘗試此:

if(type2 != RenderType.DataUri) { 
    if ((type2 & RenderType.ViewPage) == RenderType.ViewPage) 
    { 
     Console.WriteLine("ViewPage"); 
    } 


    if ((type2 & RenderType.GZip) == RenderType.GZip) 
    { 
     Console.WriteLine("GZip"); 
    } 
} 

當使用位掩碼值0通常表示一個NONE-標誌。所以,你應該開始從1數到2^N,這是一個更好的做法恕我直言:

[FlagsAttribute] 
    private enum RenderType 
    { 
     None = 0, 
     DataUri = 1, 
     GZip = 2, 
     ContentPage = 4, 
     ViewPage = 8, 
     HomePage = 16 
    } 
0

0(零)作爲一個[標誌]枚舉的可能值不指定。請記住,[Flags]枚舉是一個位字段,值爲零並不真正映射到任何字段,因此它將始終返回true。

Framework Design Guidelines通過克齊斯茨托夫·克瓦林納:

Avoid using flag enum values normal members that are negative or zero. 

負值產生位運算意想不到/混亂的結果。一個枚舉值爲零會產生問題和操作等:

0

原因是RenderType.DataUri的值爲0

你的代碼的作用是通過在type2和它正在測試的枚舉成員之間執行按位and操作來檢查type2 enum變量的按位配置。

在您的示例中,type2的值爲4,即0100二進制(最多4位,您的枚舉需要)。當你測試RenderType.GZip0001),它下面的計算:

0100 & 0001 = 0000 

由於0000 != 0001,該RenderType.GZip位不type2設置。但是,0100 & 0000始終爲0000,因此在檢查RenderType.DataUri時總是會變爲true。

本質上,Flags枚舉爲其每個成員使用不同的位,但由於0不代表整數中的某個位,因此其行爲不如預期。