C#中的[Flags]枚举属性是什么意思?

我不时看到如下枚举:

[Flags]

public enum Options

{

None = 0,

Option1 = 1,

Option2 = 2,

Option3 = 4,

Option4 = 8

}

我不明白该[Flags]属性的确切作用。

任何人都可以发表很好的解释或榜样吗?

回答:

[Flags]每当可枚举表示可能值的集合而不是单个值时,应使用该属性。此类集合通常与按位运算符一起使用,例如:

var allowedColors = MyColor.Red | MyColor.Green | MyColor.Blue;

请注意,该[Flags]属性 启用此功能-它所做的只是允许该.ToString()方法很好地表示:

enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }

[Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 }

...

var str1 = (Suits.Spades | Suits.Diamonds).ToString();

// "5"

var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString();

// "Spades, Diamonds"

同样重要的是要注意[Flags] 自动使枚举值的幂为2。如果省略数字值,则枚举将无法按位操作,因为默认情况下,该值从0开始并递增。

不正确的声明:

[Flags]

public enum MyColors

{

Yellow, // 0

Green, // 1

Red, // 2

Blue // 3

}

如果以此方式声明,则这些值将为Yellow = 0,Green = 1,Red = 2,Blue =3。这将使其变为无用的标志。

这是正确声明的示例:

[Flags]

public enum MyColors

{

Yellow = 1,

Green = 2,

Red = 4,

Blue = 8

}

要检索属性中的不同值,可以执行以下操作:

if (myProperties.AllowedColors.HasFlag(MyColor.Yellow))

{

// Yellow is allowed...

}

或.NET 4之前的版本:

if((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow)

{

// Yellow is allowed...

}

if((myProperties.AllowedColors & MyColor.Green) == MyColor.Green)

{

// Green is allowed...

}

之所以可行,是因为您在枚举中使用了2的幂。在幕后,您的枚举值看起来像这样的二进制1和0:

 Yellow: 00000001

Green: 00000010

Red: 00000100

Blue: 00001000

同样,使用二进制按位或运算符将属性 AllowedColors 设置为红色,绿色和蓝色后|AllowedColors 如下所示:

myProperties.AllowedColors: 00001110

因此,当您检索该值时,您实际上是在&对这些值执行按位与运算:

myProperties.AllowedColors: 00001110

MyColor.Green: 00000010

-----------------------

00000010 // Hey, this is the same as MyColor.Green!

关于0在您的枚举中的使用,引自MSDN:

[Flags]

public enum MyColors

{

None = 0,

....

}

使用None作为值为零的标志枚举常量的名称。

但是,您可以在数值和None枚举常量之间进行逻辑比较而不是按位比较,以确定是否设置了数值中的任何位。

您可以在msdn上找到有关flags属性及其用法以及在msdn上设计标志的更多信息。

以上是 C#中的[Flags]枚举属性是什么意思? 的全部内容, 来源链接: utcz.com/qa/424922.html

回到顶部