FlagsAttribute是什么?

FlagsAttribute特性的使用还是很常见的,他只能应用于Enum枚举数,下面是官方文档的说明
(官方文档:https://docs.microsoft.com/en-us/dotnet/api/system.flagsattribute?view=netframework-4.7.2)

Indicates that an enumeration can be treated as a bit field; that is, a set of flags.

用于表明一个枚举可以当作位标志来处理.即一组标志。简单说:当我们在使用枚举的值与值之间进行组合的时候(按位OR),Flags属性可以给我们提供更直观的格式化输出(以字符串的形式输出每个枚举值)方便我们调试,即改变了System.Enum的ToString和Format的行为。

枚举Enumerationk中定义的值通常是互斥的,比如方向,颜色,我们在只涉及到一种值的情况下,不需要考虑,但有些需求是会出现值与值之间存在可能的组合关系(combination),而且这种需求会在开发中非常的实用。

比如前面讲过的反射(Reflection),我在通过字符串搜索成员的时候,需要指定BindingFlags(枚举),我可能要同时包含Instance,Public,NoPublic,DeclaredOnly等等多个条件,这时候使用位操作是最简单的方法。而使用FlagsAttribute可以给我们带来更多的便利性(当然实现位操作他不是必要的)

实现元素的组合,要对枚举(Ennumeration)的值有要求,必须是2的N次幂,如1,2,4,8.....
这样定义,每一个值都占有一个独立的位,相当于开关,不会重叠,如下图:

40596e8059b382e6ff79a1b6a55fa33.png

通过位|(OR)操作符,将需要的位打开,如:

public enum Vegetables
    {
        Cabbage = 1<<0,
        Carrot = 1<<1,
        Cuke = 1<<2,
        Potato = 1<<3,
    }

......
Vegetables vegetables = Vegetables.Cabbage | Vegetables.Carrot | Vegetables.Cuke | Vegetables.Potato;
//vegetables里同时包含了4种蔬菜,结果是:15,如图所示:

249cd997ee2862ecd9b7ced04212fc0.png

这时候在控制台输出vegetables的值,打印出来15,因为15这个值在枚举中并没有定义过,但通常这种输出的值并不利于我们调试,我们无法马上知道15或是其它值是由哪些值组合而来的,我们希望能够更直观的看到他们,在这里使用FlagsAttribute可以对位标志的值提供更好的格式化输出,以字符串的形式呈现。

如我们将枚举修改如下:

[Flags]//添加Flags属性
public enum Vegetables
    {
        Cabbage = 1<<0,
        Carrot = 1<<1,
        Cuke = 1<<2,
        Potato = 1<<3,
    }

这时候再输出vetegables的值,控制台会输出如下:

Cabbage, Carrot, Cuke, Potato

这样的结果才方便我们去调试.

在将这些值组合起来之后,我如何验证我是否包含了哪个值?即是否打开了哪个开关?
通过位&(AND)操作符

bool containCarrot = (vegetables&Vegetables.Carrot) == Vegetables.Carrot;

如图:


37574caa2b7bddbe3bcfb65e5fa81c0.png

二进制1111和0010进行位&运算,结果是0010,Carrot位是打开的

如何关闭已经打开的位标志?
实际上就是将该位设置为0.比如我要关闭(删除)Carrot这个值
代码如下:

vegetables &= (~Vegetables.Carrot);

1111&=(~0010)=1111&=1101
结果为:13(Cabbage, Cuke, Potato)
(这里就不再上图了)

位标志的用途非常多,多条件的需求,除了上面说到的反射(多条件查询BindingFlags),比如主角的被动技能,加速,回血,无敌,防御力,xx力提升等等,可以同时作用于角色,通过位标志的组合可以很方便的实现该功能.


到此为止,如果大家发现有什么不对的地方,欢迎指正,共同提高,感谢您的阅读!

编辑于2018.7.12

--闲言碎语


e156177364ebf38d2c4b7c90ef239d6.png

(最近知了猴又出来了,每年都要拿着手电筒去树上找,这是小时候最快乐的趣事儿之一,那时候会抓回来炸着吃,飞来飞去的就用蜘蛛网或塑料袋做成的捕捉工具来抓,然后烤着吃,味道非常香...)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 1.编译程序(1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a.o...
    萌面大叔2阅读 1,279评论 0 1
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,416评论 1 14
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,094评论 1 19
  • 主题模型为非监督模型,且都需要构造一个矩阵,推测的是隐含的主题或者模式(如偏好)。都会变换出对矩阵中纵横两个维度的...
    吹洞箫饮酒杏花下阅读 886评论 0 1
  • 趁青春还剩下一点点的余温,温暖着你的眼泪,我不怕寒冷,迎着这岁月的风。 谷雨节气,春天已经走到了最后,夏天就要来了...
    是丁二呀阅读 167评论 0 1