首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FlagsAttribute for Enum

FlagsAttribute for Enum
EN

Stack Overflow用户
提问于 2013-02-22 05:19:55
回答 3查看 184关注 0票数 0

我正在努力学习C#的文言文。当我读到一些文件时,我写了一个程序。但我不明白这个程序是怎么运作的。有人能帮我一下它的工作吗?

我在下面发布我的代码:

程序1 :

代码语言:javascript
复制
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 :

在这里,我在enum中赋值整数。

代码语言:javascript
复制
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条件有什么不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-22 05:40:35

为了补充Jeremy的答案,考虑到他对天的第二个(和正确的)定义,二进制表示是:

代码语言:javascript
复制
0000 0001   Monday
0000 0010   Tuesday
0000 0100   Wednesday
0000 1000   Thursday
0001 0000   Saturday
0010 0000   Sunday

接下来,执行以下操作

代码语言:javascript
复制
var holidays = Days.Sunday | Days.Saturday;

这执行按位执行或:

代码语言:javascript
复制
      0001 0000   Saturday
OR    0010 0000   Sunday
      --------------------
      0011 0000   Saturday | Sunday

接下来,检查以下内容

代码语言:javascript
复制
((Days.Sunday | holidays) == Days.Sunday)

这意味着:

代码语言:javascript
复制
   0010 0000   Sunday
OR 0011 0000   holidays  (= Saturday | Sunday)
   ---------
   0011 0000   This is still holidays and does not equal Sundays

如果要检查“假日”是否设置了星期日位,则应按位使用

((Days.Sunday及假日) == Days.Sunday)

代码语言:javascript
复制
    0010 0000   Sunday
AND 0011 0000   holidays  (= Saturday | Sunday)
    ---------
    0010 0000   Sunday

还请注意,最近版本的.NET框架内置了对标志检查的支持:

代码语言:javascript
复制
var holidays = Days.Sunday | Days.Saturday
holidays.HasFlag(Days.Sunday)  //Will return true
holidays.HasFlag(Days.Monday)  //Will return false

您对Days enum的定义不应该与Flags一起使用,如果您将本文中的相同逻辑应用于定义中的值,您将得到一些非常奇怪的结果。

票数 2
EN

Stack Overflow用户

发布于 2013-02-22 05:23:37

默认情况下从0开始,如:

代码语言:javascript
复制
[Flags]
enum Days
{
    Monday = 0,
    Tuesday = 1,
    Wednesday = 2,
    Thursday = 3,
    Friday = 4,
    Saturday = 5,
    Sunday = 6
};

我想你和枚举上的位操作符搞混了。通常,为了使枚举与按位运算符一起工作,您可以这样声明它们:

代码语言:javascript
复制
[Flags]
enum Days
{
    Monday = 0,
    Tuesday = 1,
    Wednesday = 2,
    Thursday = 4,
    Friday = 8,
    Saturday = 16,
    Sunday = 32
};
票数 3
EN

Stack Overflow用户

发布于 2013-02-22 05:29:30

看起来,您混淆了按位操作|和逻辑运算符||

在你最初的节目中,星期六分配5,周日分配6。

按位或:

代码语言:javascript
复制
8 4 2 1 
0 1 0 1 = 5 Saturday
0 1 1 0 = 6 Sunday
-----------
0 1 1 1 = 7 Result (Holiday).

按位或:

代码语言:javascript
复制
8 4 2 1 
0 1 1 1 = 7 Holidays
0 1 1 0 = 6 Sunday
-----------
0 1 1 1 = 7 Result.

但是,我运行了类似的代码:

代码语言:javascript
复制
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)处创建枚举。

如果您的代码被纠正了,那么这可能更符合我认为您正在寻找的内容。

代码语言:javascript
复制
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

这起作用是因为

按位或:

代码语言:javascript
复制
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).

按位或:

代码语言:javascript
复制
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).

按位或:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15017387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档