位标记集合是一种由组合出现的元素形成的列表,通常设计为以“位或”运算组合新值;枚举 类型则通常表达一种语义相对独立的数值集合。而以枚举类型来实现位标记集合是最为完美的组 合,简称为位枚举。在.NET 中,需要对枚举常量进行位运算时,通常以 System.FlagsAttribute 特 性来标记枚举类型,例如:

    class Program5
{
public static void Main(string[] args)
{
ColorStyle mycs = ColorStyle.Red | ColorStyle.Yellow | ColorStyle.Blue;
Console.WriteLine(mycs.ToString());
Console.ReadKey();
}
}
[Flags]
enum ColorStyle
{
None = 0x00,
Red = 0x01,
Orange = 0x02,
Yellow = 0x04,
Greeen = 0x08,
Blue = 0x10,
Indigotic = 0x20,
Purple = 0x40,
All = Red | Orange | Yellow | Greeen | Blue | Indigotic | Purple
}

  FlagsAttribute 特性的作用是将枚举成员处理为位标记,而不是孤立的常数

  在上例中,mycs 实例的对应数值为 21(十六进制 0x15),而覆写的 ToString 方法在 ColorStyl e 枚举中找不到对应的符号。而 FlagsAttribute 特性的作用是将枚举常数看成一组位标记来操作, 从而影响 ToString、Parse 和 Format 方法的执行行为。在 ColorStyle 定义中 0x15 显然由 0x01、0x0 4 和 0x10 组合而成,示例的结果将返回:Red, Yellow, Blue,而非 21,原因正在于此。

  位枚举首先是一个枚举类型,因此具有一般枚举类型应有的所有特性和方法,例如继承于 En um 类型,实现了 ToString、Parse、GetValues 等方法。但是由于位枚举的特殊性质,因此应用于 某些方法时,应该留意其处理方式的不同之处。这些区别主要包括:

  Enum.IsDefined 方法不能应对位枚举成员,正如前文所言位枚举区别与普通枚举的重要表现是: 位枚举不具备排他性,成员之间可以通过位运算进行组合。而 IsDefined 方法只能应对已定义 的成员判断,而无法处理组合而成的位枚举,因此结果将总是返回 false。例如:

Enum.IsDefined(typeof(ColorStyle), 0x15)
Enum.IsDefined(typeof(ColorStyle), "Red, Yellow, Blue")

  MSDN 中给出了解决位枚举成员是否定义的判断方法:就是将该数值与枚举成员进行“位与”运 算,结果不为 0 则表示该变量中包含该枚举成员,例如:

if ((mycs & ColorStyle.Red) != )
Console.WriteLine(ColorStyle.Red + " is in ColorStyle");

  Flags 特性影响 ToString、Parse 和 Format 方法的执行过程和结果。

  如果不使用 FlagsAttribute 特性来标记位枚举,也可以在 ToString 方法中传入“F”格式来获得同 样的结果,以“D”、“G”等标记来格式化处理,也能获得相应的输出格式。

  在位枚举中,应该显式的为每个枚举成员赋予有效的数值,并且以 2 的幂次方为单位定义枚举 常量,这样能保证实现枚举常量的各个标志不会重叠。当然你也可以指定其它的整数值,但是 应该注意指定 0 值作为成员常数值时,“位与”运算将总是返回 false。

最新文章

  1. 自定义UITabBarController标签视图控制器
  2. web视频添加webvtt字幕测试
  3. c#和Javascript中去重总结
  4. 单行文字滚动就用myslider
  5. NSOperationQueue的基本使用
  6. 集成IJKplayer视频直播框架
  7. MicroService/web Service/webAPI/RPC
  8. Silverlight DataGrid数据行背景颜色控制
  9. Java基础知识强化之集合框架笔记67:Hashtable的实现原理
  10. UML图基本类型
  11. 作为一个新人,怎样学习嵌入式Linux,(韦东山)
  12. cf-#189-div 2
  13. ios字体大小适应不同屏幕
  14. Java学习笔记——浅谈数据结构与Java集合框架(第三篇、Map)
  15. 为什么epoll会那么高效
  16. Hive语法
  17. MySql自动备份shell
  18. Centos 7 搭建.net web项目
  19. 浅谈CDQ分治与偏序问题
  20. az nginx install and other

热门文章

  1. CircleLinkList(循环链表)
  2. 关于PGSQL连接问题
  3. 【内容摘录自 MDN】变量作用域
  4. Nessus忘记用户名和密码
  5. QT无法读入txt文件内容
  6. 解决苹果手机(IOS)input失焦后,页面不恢复的问题
  7. Jsp和Servlet关系
  8. 设计模式课程 设计模式精讲 8-8 单例设计模式-Enum枚举单例、原理源码解析以及反编译实战
  9. C++11并发编程3------线程传参
  10. RF之目录结构、执行参数、用例标签 -6