挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute
来源:互联网 发布:循环算法的时间复杂度 编辑:程序博客网 时间:2024/06/05 23:08
来隐藏或者开启界面的相关配送方式,如果大家订过机票可能知道配送方式有很多种,比如“无需打印行程单(PJN)”,“机场自取(Airport)”,
“市内配送(CND)”,“快递(EMS)”等等。
根据上面的逻辑就可以知道,配送方式是有两种状态,可用与不可用,在逻辑实现上,很容易就想到了bit位,每一个位代表一个配送方式,
0表示不可用,1表示可用,所以航班接口只要给一个数字就行了,我只需要判断bit位中哪些是1就行了。
比如用8位byte字段为例:
从图中可以看到,快递(EMS)是不可用的,那么怎么判断呢,其实也就17&32就ok了,如果为32,则说明可用,为0则不可用,其他
的判断可以用同样的手段。
上次看到的代码逻辑就这样了,不过毕竟在一个团队里面,水平参差不齐,用纯数字来&,|,^,最起码不是那么容易理解的,如果
配上枚举的话,可能就更完美了。
说起枚举,其实就是编译器给我们的语法糖,本质上来说就是一个继承在Enum类型下的一个个const字段,既然是const,那
就天生具备(+,-,* ,/ ^,| &)这样常规的数学运算。
举个例子:
1 [Flags] 2 enum Deliver : byte 3 { 4 CND = 0x01, 5 PJS = 0x02, 6 SND = 0x04, 7 PJN = 0x08, 8 Airport = 0x16, 9 EMS = 0x3210 }
然后看看上面的Enum生成的IL代码。
可能有人会问,这里的“uint8” 是怎么回事,其实这个就是隐藏到枚举类型后面的真实的基元类型,可以用GetUnderlyingType来获取。
通常情况下,枚举只能显示一个状态,那么如果让枚举显示多个状态,这个时候就可以用FlagAttribute来标记,让标志位来处理枚举,
来做强大的组合功能。
举个例子:从图中航班政策返回的17的数字来看,我们知道Airport和CND是可用的,如果用了FlagAttribute标记后,这次我们不用担
心,直接将17转化为枚举即可。
从图中看到,经过枚举转换后,可能对程序员的理解以及记录log上面,更方便分析和追踪。
- 挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute
- 挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute
- 挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject
- 挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup
- 挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup
- 挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject
- 那些我们不学不行的东西:date函数
- 那些我们不得不学的东西:JAR
- Ubuntu 12.04.5使用过程中那些书上不教的东西
- C++中那些不常用的关键字
- 【那些年我们用过的C#系列讲座 2】基于接口的C#编程
- 【那些年我们用过的C#系列讲座 1】命名空间和我们第一个C#程序
- 那些年我们在Python掉进的坑——清除不想要的字符
- 关于那些Android中不常用的设置属性
- 关于那些Android中不常用的设置属性
- Emacs中那些不常用的行操作命令
- 我也要谈谈大型网站架构之系列(3)——死了都要说的缓存
- 什么是HTTP Headers?
- 我也要谈谈大型网站架构之系列(4)——分布式中的异步通信
- 挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject
- python爬虫之爬取捞月狗直播信息
- 挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute
- 删边
- 跟着官方指南学习TensorFlow(序)
- 面试中可能会被问到的几个关于“委托”的问题
- 非模态对话框
- 可空类型为什么可以为空?也许会被面试到哦。。。
- 目标检测算法:RCNN、YOLO vs DPM
- node.js学习(十五、Events事件模块)
- const,readonly 这些你真的懂吗? 也许会被面试到哦。。。