栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#中的[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值

关于

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

[Flags]public enum MyColors{    None = 0,    ....}

使用None作为值为零的标志枚举常量的名称。 您不能在按位与运算中使用None枚举常量来测试标志,因为结果始终为零。
但是,您可以在数值和None枚举常量之间进行逻辑比较而不是按位比较,以确定是否设置了数值中的任何位。

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号