zoukankan      html  css  js  c++  java
  • 挖一挖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上面,更方便分析和追踪。

  • 相关阅读:
    android listview 圆角的实现方案,模仿Iphone的UITableView
    在android编程中插入背景图片
    iOS开发UI篇—UIPickerView控件简单介绍
    iOS开发UI篇章 15-项目中的常见文件
    iOS开发UI篇章之通知中心(NSNotificationCenter)
    iOS开发UI篇章之应用管理的九宫格坐标计算
    iOS开发UI篇章之-Button基础
    Xcode-Run和快捷键
    Css基础-介绍及语法
    CSDN首页> 移动开发 直接拿来用!最火的Android开源项目(完结篇)
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/3815428.html
Copyright © 2011-2022 走看看