位标记集合是一种由组合出现的元素形成的列表,通常设计为以“位或”运算组合新值;枚举 类型则通常表达一种语义相对独立的数值集合。而以枚举类型来实现位标记集合是最为完美的组 合,简称为位枚举。在.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。

你必须知道的.Net 8.4.4 位枚举的更多相关文章

  1. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  2. (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验

    转自:http://www.cnblogs.com/zhaopei/p/5721789.html [推荐]初级.NET程序员,你必须知道的EF知识和经验   阅读目录   [本文已下咒.先顶后看,会涨 ...

  3. 《你必须知道的.NET》读书笔记一:小OO有大智慧

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象  (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...

  4. 《你必须知道的.NET》读书笔记二:小OO有大原则

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

  5. 《你必须知道的.NET》读书笔记三:体验OO之美

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...

  6. 《你必须知道的.NET》读书笔记:从Hello World认识IL

    通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...

  7. MVC中你必须知道的13个扩展点

    MVC中你必须知道的13个扩展点 pasting 转:http://www.cnblogs.com/kirinboy/archive/2009/06/01/13-asp-net-mvc-extensi ...

  8. 前端开发必须知道的JS(二) 闭包及应用

    http://www.cnblogs.com/ljchow/archive/2010/07/06/1768749.html 在前端开发必须知道的JS(一) 原型和继承一文中说过下面写篇闭包,加之最近越 ...

  9. 《你必须知道的.NET》书中对OCP(开放封闭)原则的阐述

    开放封闭原则(OCP,Open Closed Principle)是面向对象原则的核心.由于软件设计本身所追求的墓边就是封装变化,降低耦合,而开放封闭原则就是对这一目标的直接体现.(你必须知道的.NE ...

随机推荐

  1. nodejs的forEach不支持break打断

  2. header头中 content-type的作用

  3. SqlCacheDependency 缓存数据库依赖

    启用SQL SERVER 通知 aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d N ...

  4. 「JSOI2014」支线剧情2

    「JSOI2014」支线剧情2 传送门 不难发现原图是一个以 \(1\) 为根的有根树,所以我们考虑树形 \(\text{DP}\). 设 \(f_i\) 表示暴力地走完以 \(i\) 为根的子树的最 ...

  5. 看完这篇微服务架构设计思想,90%的Java程序员都收藏了

    本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...

  6. Oracle忘记密码怎么办?

    1.打开cmd,输入sqlplus /nolog,回车:输入“conn / as sysdba”;输入“alter user sys identified by 新密码”,注意:新密码最好以字母开头, ...

  7. hyfhaha大事记——luogu

    成就墙 AK CSP-J 初赛 AK CSP-J 复赛 CSP- J 一等奖 CSP-S 一等奖 大事记 2017-09-20 13:54 注册洛谷账号 之后洛谷一直处于沉沦状态 2018 2018- ...

  8. 「快学springboot」SpringBoot多环境配置文件

    前言 我们都知道springboot的配置卸载application.properties配置文件上(或者application.yml).但是,如果想要把不同的环境(如开发环境,测试环境,生产环境) ...

  9. AI基础概念

    基础概念 epoch:使用训练的全部数据对模型进行一次完整的训练,被成为“一代训练”.当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch.(也就是说,所有训练样本在神经网络 ...

  10. C++ — 后缀表达式转表达式树

    2018-07-21 16:57:26 update 建立表达式树的基本思路:方法类似由下而上建立堆的思想,所以时间复杂度为O(n),这样算法就会变得很简单,只用考虑处理需要入栈的节点和栈中的节点即可 ...