带标志的C#问题

时间:2011-09-23 20:40:42

标签: c# .net asp.net variables enums

我有一个枚举(旗帜)

[Flags]
public enum DisplayMode
{
    None,
    Dim,
    Inverted,
    Parse,
    Italics,
    Bold
}

我想将两个标志分配给变量,如下所示:

var displayFlags = DisplayMode.Parse | DisplayMode.Inverted;

但是,当我在分配后立即调试并将鼠标悬停在此变量上时,它表示displayFlagsDisplayMode.Dim | DisplayMode.Inverted

我缺少什么/不理解?

6 个答案:

答案 0 :(得分:9)

你错过了分配标志敏感值,例如:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}

这样每个值在数字表示中都有一个单独的位。

如果你不相信你能够加倍值,你可以使用位移:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim =      1 << 0,
    Inverted = 1 << 1,
    Parse =    1 << 2,
    Italics =  1 << 3,
    Bold =     1 << 4
}

来自FlagsAttribute的文档:

  

FlagsAttribute和Enum指南

     
      
  • 仅当对数值执行按位运算(AND,OR,EXCLUSIVE OR)时,才使用FlagsAttribute自定义属性进行枚举。

  •   
  • 定义2的幂的枚举常量,即1,2,4,8等。这意味着组合枚举常量中的各个标志不会重叠。

  •   
     

...

答案 1 :(得分:4)

默认情况下,枚举会为成员分配连续值。所以你基本上得到了:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 3,
    Italics = 4,
    Bold = 5
}

这对二进制/标志不起作用。所以你需要明确:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}

答案 2 :(得分:1)

声明后,您没有为枚举提供适当的值:

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1,
    Inverted = 2,
    Parse = 4,
    Italics = 8,
    Bold = 16
}

答案 3 :(得分:0)

您需要明确指定标志的值。如声明,Parse是3,这是Dim |反转。

尝试

[Flags]
public enum DisplayMode
{
    None = 0,
    Dim = 1 << 0,
    Inverted = 1 << 1,
    Parse = 1 << 2,
    Italics = 1 << 3,
    Bold = 1 << 4
}

答案 4 :(得分:0)

您需要将枚举值定义为2的幂:

[Flags]
public enum DisplayMode
{
    None = 1,
    Dim = 2,
    Inverted = 4,
    Parse = 8,
    Italics = 16,
    Bold = 32
}

此处提供更多信息:http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx

答案 5 :(得分:0)

由于您正在使用标记,因此您需要以二进制术语进行思考,因此每次应将您的值增加2。例如,想一想:

0001 = 0x01,
0010 = 0x02,
0100 = 0x04,
1000 = 0x08

依旧......