2013-02-22 58 views
0

我想在C#中學習枚舉。正如我在一些文件中看到的,我寫了一個程序。但我並不知道這個程序是如何工作的。任何人都可以幫我介紹一下它的工作嗎?FlagsAttribute for Enums

我張貼我下面的代碼:

計劃1:

public partial class MainPage { 
    [Flags] 
    enum Days { 
     Monday, 
     Tuesday, 
     Wednesday, 
     Thursday, 
     Friday , 
     Saturday, 
     Sunday 
    }; 

    // Constructor 
    public MainPage() { 
     InitializeComponent(); 
     Days holidays = Days.Sunday | Days.Saturday; 
     if ((Days.Sunday | holidays) == Days.Sunday) // This returns true. Why ? 
      MessageBox.Show("True"); 
     else 
      MessageBox.Show("False"); 
    } 

方案2:

在這裏,我在枚舉

public partial class MainPage { 
    [Flags] 
    enum Days { 
     Monday = 1, 
     Tuesday = 2, 
     Wednesday = 5, 
     Thursday = 8, 
     Friday = 10, 
     Saturday = 3, 
     Sunday = 0 
    }; 

    // Constructor 
    public MainPage() { 
     InitializeComponent(); 
     Days holidays = Days.Sunday | Days.Saturday; 
     if ((Days.Sunday | holidays) == Days.Sunday) // Why this returns false ? 
      MessageBox.Show("True"); 
     else 
      MessageBox.Show("False"); 
    } 

將整數值指派w ^在程序2中分配整數值後,hat是if條件中的差異?

+0

|做一個按位或。 – lahsrah 2013-02-22 05:22:44

+0

爲什麼要投票?這是一個糟糕的問題嗎? – Arun 2013-02-22 05:32:16

+3

我不認爲這是一個糟糕的問題,實際上我遇到了很多開始有問題的人理解Flag枚舉。雖然 – TimothyP 2013-02-22 05:42:16

回答

2

要添加傑里米的答案,考慮到他的天的第二個(正確)的定義 二進制表示:

0000 0001 Monday 
0000 0010 Tuesday 
0000 0100 Wednesday 
0000 1000 Thursday 
0001 0000 Saturday 
0010 0000 Sunday 

下一頁您執行以下

var holidays = Days.Sunday | Days.Saturday; 

這會執行按位或:

 0001 0000 Saturday 
OR 0010 0000 Sunday 
     -------------------- 
     0011 0000 Saturday | Sunday 

接下來您檢查以下

((Days.Sunday | holidays) == Days.Sunday) 

這意味着:

0010 0000 Sunday 
OR 0011 0000 holidays (= Saturday | Sunday) 
    --------- 
    0011 0000 This is still holidays and does not equal Sundays 

如果你想檢查是否「假期」已經在週日位設置你應該使用按位與

( (Days.Sunday & holidays)== Days.Sunday)

0010 0000 Sunday 
AND 0011 0000 holidays (= Saturday | Sunday) 
    --------- 
    0010 0000 Sunday 

還要注意的是最近的.NET Framework的版本有 內置支持標誌檢查:

var holidays = Days.Sunday | Days.Saturday 
holidays.HasFlag(Days.Sunday) //Will return true 
holidays.HasFlag(Days.Monday) //Will return false 

您的天枚舉的定義不應與[國旗],如果您將 使用從這篇文章到你的定義 中的值相同的邏輯,你會得到一些非常奇怪的結果。

+0

謝謝蒂莫西。你解釋得很好。現在我明白了。 – Arun 2013-02-22 05:49:17

+2

@TimothyP你錯過了'Days.Monday = 0'錯誤。快速,更新:P – Corey 2013-02-22 05:51:35

+0

確實,我很抱歉 – TimothyP 2013-02-22 05:52:31

3

枚舉默認從0開始,如:

[Flags] 
enum Days 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 3, 
    Friday = 4, 
    Saturday = 5, 
    Sunday = 6 
}; 

我認爲你正在使用的枚舉位運算符混淆。通常使枚舉與位運算工作,你宣佈他們是這樣的:

[Flags] 
enum Days 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 4, 
    Friday = 8, 
    Saturday = 16, 
    Sunday = 32 
}; 
+0

謝謝jeremy .. – Arun 2013-02-22 05:48:40

2

看起來你與邏輯運算符||混淆位運算符|

在原來的計劃,週六被分配5和週日被分配6.

位或:

8 4 2 1 
0 1 0 1 = 5 Saturday 
0 1 1 0 = 6 Sunday 
----------- 
0 1 1 1 = 7 Result (Holiday). 

位或:

8 4 2 1 
0 1 1 1 = 7 Holidays 
0 1 1 0 = 6 Sunday 
----------- 
0 1 1 1 = 7 Result. 

但是我跑了類似相同的代碼:

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    [Flags] 
    enum Days 
    { 
     Monday,  //Default 0 
     Tuesday, //Default 1 
     Wednesday, //Default 3 
     Thursday, //Default 4 
     Friday,  //Default 5 
     Saturday, //Default 6 
     Sunday  //Default 7 
    }; 

    static void Main(string[] args) 
    { 
     Days holidays = Days.Sunday | Days.Saturday; 
     if ((Days.Sunday | holidays) == Days.Sunday) // This returns true. Why ? 
      Console.WriteLine("True"); 
     else 
      Console.WriteLine("False"); 

     Console.ReadKey(); 
    } 
    } 
} 

結果:False(不像你的例子中那樣)。

如預期的那樣7不等於6. 我的假設是在您的示例中存在缺少代碼或錯誤類型的代碼。

我強烈建議您閱讀FlagsAttribute如何正確使用它,其中包括在位值(1,2,4,8,16,32)處創建枚舉。

如果你的代碼被糾正了,那麼這可能會更符合我相信你在尋找的內容。

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    [Flags] 
    enum Days 
    { 
     Monday = 1, 
     Tuesday = 2, 
     Wednesday = 4, 
     Thursday = 8, 
     Friday = 16, 
     Saturday = 32, 
     Sunday = 64 
    }; 

    static void Main(string[] args) 
    { 
     Days holidays = Days.Sunday | Days.Saturday; 

     if ((Days.Sunday | holidays) == holidays) 
      Console.WriteLine("Sunday is a Holiday"); 
     else 
      Console.WriteLine("Sunday is a Holiday"); 

     if ((Days.Tuesday | holidays) == holidays) 
      Console.WriteLine("Tuesday is not a Holiday"); 
     else 
      Console.WriteLine("Tuesday is not a Holiday"); 

     Console.ReadKey(); 
    } 
    } 
} 

結果:Sunday is a HolidayTuesday is not a Holiday

這樣做是因爲,

位或:

64 32 16 8 4 2 1 
0 1 0 0 0 0 0 = 32 Saturday 
1 0 0 0 0 0 0 = 64 Sunday 
---------------------- 
1 1 0 0 0 0 0 = 96 Result (Holiday). 

位或:

64 32 16 8 4 2 1 
1 1 0 0 0 0 0 = 96 Holiday 
1 0 0 0 0 0 0 = 64 Sunday 
---------------------- 
1 1 0 0 0 0 0 = 96 Result (Holiday). 

位或:

64 32 16 8 4 2 1 
1 1 0 0 0 0 0 = 96 Holiday 
0 0 0 0 0 1 0 = 32 Tuesday 
---------------------- 
1 1 0 0 0 1 0 = 97 Result (Not Holiday). 
+2

'Days.Monday'應該被定義爲1,否則'(Days.Monday |節假日)==節假日「總是如此。此外,更好的測試是'(Days.Sunday&holidays)== Days.Sunday',因爲這更清楚地表明瞭意圖。 – Corey 2013-02-22 05:50:15

+0

謝謝你是對的! – 2013-02-22 05:50:36