0

C#でenumを勉強しようとしています。いくつかのドキュメントを読みながら、プログラムを作成します。しかし、このプログラムがどのように機能しているのかわかりません。誰かがその作業について私を助けてくれますか?

私は以下のコードを投稿しています:

プログラム 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");
  }

プログラム 2 で整数値を代入した後の if 条件の違いは何ですか?

4

3 に答える 3

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
};
于 2013-02-22T05:23:37.887 に答える
2

ビット演算子|と論理演算子を混同しているようです||

元のプログラムでは、土曜日に5が割り当てられ、日曜日に6が割り当てられます。

ビットごとのOR:

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

ビットごとのOR:

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 Holiday Tuesday is not a Holiday

これが機能する理由は、

ビットごとのOR:

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

ビットごとのOR:

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

ビットごとのOR:

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).
于 2013-02-22T05:29:30.470 に答える
2

ジェレミーの答えに追加するには、彼の 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;

これは、ビット単位の OR を実行します。

      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

「休日」に日曜日のビットが設定されているかどうかを確認したい場合は、ビットごとの AND を使用する必要があります

((日.日曜 & 祝日) == 日.日曜)

    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

Days 列挙型の定義は [Flags] では使用しないでください。この投稿と同じロジックを定義の値に適用すると、非常に奇妙な結果が得られます。

于 2013-02-22T05:40:35.280 に答える