挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute

原文:挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute

  说到FlagsAttribute,源自前几天看到了一小段代码,大概意思就是根据航班政策来返回哪些配送方式是否可用,根据这些是否可用

来隐藏或者开启界面的相关配送方式,如果大家订过机票可能知道配送方式有很多种,比如“无需打印行程单(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 = 0x32
10     }

然后看看上面的Enum生成的IL代码。

可能有人会问,这里的“uint8” 是怎么回事,其实这个就是隐藏到枚举类型后面的真实的基元类型,可以用GetUnderlyingType来获取。

通常情况下,枚举只能显示一个状态,那么如果让枚举显示多个状态,这个时候就可以用FlagAttribute来标记,让标志位来处理枚举,

来做强大的组合功能。

举个例子:从图中航班政策返回的17的数字来看,我们知道Airport和CND是可用的,如果用了FlagAttribute标记后,这次我们不用担

心,直接将17转化为枚举即可。

从图中看到,经过枚举转换后,可能对程序员的理解以及记录log上面,更方便分析和追踪。

挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute,布布扣,bubuko.com

时间: 2024-10-21 21:50:59

挖一挖C#中那些我们不常用的东西之系列(5)——FlagAttribute的相关文章

挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim

原文:挖一挖C#中那些我们不常用的东西之系列(3)--StackTrace,Trim 时间太快了,三月又要过去了,告别一下...继续期待生死未卜的四月,今天我们继续挖一挖. 一: Environment.StackTrace 可能我们看到最多的就是catch中的e参数,里面会有一个StackTrace,然后不可否认的这玩意太有用了,它会把调用堆栈 中的信息输出出来,有了它,我们就可以快速的知道运行代码的执行流并且快速的定位到问题. 有时候我们会遇到这样两个问题: ①:线上的bug在本地不能重现.

挖一挖C#中那些我们不常用的东西之系列(2)——IsXXX 系列方法

原文:挖一挖C#中那些我们不常用的东西之系列(2)--IsXXX 系列方法 不知道有人做没做过对日外包,如果做过的话,那么对vb.net应该非常熟悉了,当年我刚毕业的时候也做过四个月的外包,那种日子简直 不是人过的,就连大楼下面买珠宝的阿姨都说,这些孩子,只看过他们上班,就没见过他们下班,不过有一点好,有个QA的小姑娘天天下午6 点教我们倭瓜语,现在还在勾搭中...   好了,现在我们看看需求. 一: 如何判断“a”是不是数字类型. ①:在C#中我们可能会用TryParse来判断当前的”a“是否

挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup

原文:挖一挖C#中那些我们不常用的东西之系列(1)--ToDictionary,ToLookup 这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,其中ToArray和ToList,我想大家用的是非常非常多,但是ToDictionary和ToLookup 不见得有多少人用了,但不能否认的是这些方法确实很有用. 不多废话了,直接如主题,我们有这样的一个实体,包含

挖一挖C#中那些我们不常用的东西之系列(4)——GetHashCode,ExpandoObject

原文:挖一挖C#中那些我们不常用的东西之系列(4)--GetHashCode,ExpandoObject 这篇继续分享下GetHashCode和ExpandoObject这两个比较好玩的方法. 一:GetHashCode 从MSDN上可以看到的解释是:用作特定类型的哈希函数,也就是说任何对象的实例都会有一个int32类型的HashCode,并且存放在FCL中的 HashCollection中,废话不说,看个例子: 从图中可以看到,两个类实例的hashcode不同,说明二者不是同一个引用,也就有了

挖一挖不经常使用到而又非常有用的重载-Trim

这个我想没有那个开发者说不知道,可是里面有一个重载.这个不知道有多少开发者知道! 能够看到,我能够去掉字符串前后的指定字符.只要我在char[]中指定就可以.而不是只去掉空格.这次为什么要提它,是由于前 几天用asp对接.net的时候遇到的,在asp中有一个join方法.可是它不像C#中的String.Join(",")方法能够去掉尾部的"," .比方 数组{a,b,c},在asp中join后会变成"a,b,c,".而C#中会变成"a,

挖一挖不常用的Trim重载

这个我想没有那个开发人员说不知道,但是里面有一个重载,这个不知道有多少开发人员知道! 可以看到,我可以去掉字符串前后的指定字符,只要我在char[]中申请即可,而不是仅仅去掉空格,这次为什么要提它,是因为前 几天用asp对接.net的时候遇到的,在asp中有一个join方法,但是它不像C#中的String.Join(",")方法可以去掉尾部的"," ,比如 数组{1,2,3},在asp中join后会变成"1,2,3,",而C#中会变成"

挖一挖不常用到而又很实用的重载-Split

Split这个基本上所有的程序开发人员都用到,一般使用单字符和长字符串拆分字符串的较多,其实还有一个重载非常好用,那就是多种组合字符来进行拆分. 例如: "aaaaaaaaaa{@}bbbbbbbbbb{@}ccccccc#cccccc"; 通过 {@}组合字符进行拆分值为aaaaaaaaaa.bbbbbbbbbb.ccccccc#cccccc的数组: string sql = "aaaaaaaaaa{@}bbbbbbbbbb{@}ccccccc#cccccc";

挖一挖不经常使用到而又非常有用的重载-Split

Split这个基本上全部的程序开发者都用到,一般使用单字符和长字符串拆分字符串的较多.事实上另一个重载很好用.那就是多种组合字符来进行拆分. 比如: "aaaaaaaaaa{@}bbbbbbbbbb{@}ccccccc#cccccc"; 通过 {@}组合字符进行拆分值为aaaaaaaaaa.bbbbbbbbbb.ccccccc#cccccc的数组: string sql = "aaaaaaaaaa{@}bbbbbbbbbb{@}ccccccc#cccccc"; //

linux中vim编辑器各种常用命令及用法

linux中vim编辑器的常用命令以及用法(注意严格区分大小写以及中英文): vim编辑器有三种模式,分别是:编辑模式,输入模式以及末行模式. 模式转换: 编辑模式>>>输入模式: i:在光标所在字符前面,转为输入模式(即转完后在光标所在字符前输入):                      I:在光标所在行的行首,转为输入模式(即转完后在行首输入,不包括行首空                         白) a:在光标所在字符后,转为输入模式(即转完后在光标所在字符后面输入):