《CLR via C#》---枚举标志和标志位
枚举类型
枚举类型定义了一组符号名称/值配对。
如
 private enum Color /* : byte */ {
  White,       // Assigned a value of 0
  Red,         // Assigned a value of 1
  Green,       // Assigned a value of 2
  Blue,        // Assigned a value of 3
  Orange,      // Assigned a value of 4
}
枚举类型使程序更容易编写、阅读和维护;枚举类型是强类型的;枚举类型是值类型。
每个枚举类型都有一个基础类型,它可以是byte、sbyte、short、ushort、int(最常用,也是C#默认选择的)、uint、long、ulong等,不能使用FCL类型。
如
internal enum Color:byte{
    White,
    Red,
    Green,
    Blue,
    Orange
}
//下面代码会显示`System.Byte`
Console.WriteLine(Enum.GetUnderlyingType(Typeof(Color)));
利用Enum提供的静态Parse和TryParse方法,可以很容易的将符号类型转为枚举类型的实例。
//因为orange定义为4,‘C’被初始化为4
Color c = (Color)Enum.Parse(typeof(Color),"orange",true);
//没有定义Brown,所以会抛出异常
try {
     c = (Color)Enum.Parse(typeof(Color), "Brown", false);
  }
  catch (ArgumentException) {
     Console.WriteLine("Brown is not defined by the Color enumerated type.");
  }
可用IsDefined方法判断数值对于某枚举类型是否合法
// Displays "True" because Color defines Red as 1
//显示True,因为定义red为1
  Console.WriteLine(Enum.IsDefined(typeof(Color), 1));
  // Displays "True" because Color defines White as 0
  Console.WriteLine(Enum.IsDefined(typeof(Color), "White"));
  // Displays "False" because a case-sensitive check is performed
  Console.WriteLine(Enum.IsDefined(typeof(Color), "white"));
  // Displays "False" ,因为没有和10对应的颜色
  Console.WriteLine(Enum.IsDefined(typeof(Color), 10));
IsDefined方法常被用于参数校验
public void SetColor(Color c){
    if(!Enum.IsDefined(typeof(Color),c)){
        throw(new ArgumentOutOfRangeException("C",c,"无效颜色值"));
    }
}
位标志
程序员要经常和位标志(bit flag)集合打交道。调用System.IO.File类型的GetAttributes方法,会返回FileAttributes类型的一个实例。FileAttribuges类型是基本类型为Int32的枚举类型,其中每一位都反映了文件的一个特性。FileAttributes类型在FCL中的定义为
// 摘要:
//     提供文件和目录的属性。
[Serializable]
[ComVisible(true)]
[Flags]
public enum FileAttributes
{
    // 摘要:
    //     此文件是只读的。
    ReadOnly = 1,//0x0001
    //
    // 摘要:
    //     文件是隐藏的,因此没有包括在普通的目录列表中。
    Hidden = 2,//0x0002
    //
    // 摘要:
    //     此文件是系统文件。 即,该文件是操作系统的一部分或者由操作系统以独占方式使用。
    System = 4,//0x0004
    //
    // 摘要:
    //     此文件是一个目录。
    Directory = 16,
    //
    // 摘要:
    //     该文件是备份或移除的候选文件。
    Archive = 32,
    //
    // 摘要:
    //     保留供将来使用。
    Device = 64,
    //
    // 摘要:
    //     该文件是没有特殊属性的标准文件。 仅当其单独使用时,此特性才有效。
    Normal = 128,
    //
    // 摘要:
    //     文件是临时文件。 临时文件包含当执行应用程序时需要的,但当应用程序完成后不需要的数据。 文件系统尝试将所有数据保存在内存中,而不是将数据刷新回大容量存储,以便可以快速访问。
    //     当临时文件不再需要时,应用程序应立即删除它。
    Temporary = 256,
    //
    // 摘要:
    //     此文件是稀疏文件。 稀疏文件一般是数据通常为零的大文件。
    SparseFile = 512,
    //
    // 摘要:
    //     文件包含一个重新分析点,它是一个与文件或目录关联的用户定义的数据块。
    ReparsePoint = 1024,
    //
    // 摘要:
    //     此文件是压缩文件。
    Compressed = 2048,
    //
    // 摘要:
    //     此文件处于脱机状态, 文件数据不能立即供使用。
    Offline = 4096,
    //
    // 摘要:
    //     将不会通过操作系统的内容索引服务来索引此文件。
    NotContentIndexed = 8192,
    //
    // 摘要:
    //     此文件或目录已加密。 对于文件来说,表示文件中的所有数据都是加密的。 对于目录来说,表示新创建的文件和目录在默认情况下是加密的。
    Encrypted = 16384,
    //
    // 摘要:
    //     文件或目录包括完整性支持数据。 在此值适用于文件时,文件中的所有数据流具有完整性支持。 此值将应用于一个目录时,所有新文件和子目录在该目录中和默认情况下应包括完整性支持。
    [ComVisible(false)]
    IntegrityStream = 32768,
    //
    // 摘要:
    //     文件或目录从完整性扫描数据中排除。 此值将应用于一个目录时,所有新文件和子目录在该目录中和默认情况下应不包括数据完整性。
    [ComVisible(false)]
    NoScrubData = 131072,
}
判断文件是否隐藏可以使用以下代码
  String file = Assembly.GetEntryAssembly().Location;
  FileAttributes attributes = File.GetAttributes(file);
  Console.WriteLine("Is {0} hidden? {1}", file, (attributes & FileAttributes.Hidden) != 0);
强烈建议向枚举类型应用定制特性类型System.FlagsAttribute,如下
[Flags] 	// The C# compiler allows either "Flags" or "FlagsAttribute".
public enum Actions {
  Read = 0x0001,
  Write = 0x0002,
  Delete = 0x0004,
  Query = 0x0008,
  Sync = 0x0010
}
使用Console.WriteLine(action.ToString())方法会输出Read等。
可以为枚举类型添加方法,通过使用扩展方法.
总结
今天的枚举类型在以前我使用的感觉不多,所以写起来也感觉倒也没有和前面那些一样有些恍然大悟的地方。将来会努力的使用频繁一些。
《CLR via C#》---枚举标志和标志位的更多相关文章
- C# 枚举的flags 标志位应用
		
枚举有个特性叫标志位,使用方法如下 [Flags] enum Foo { a =1, b = 2, c = 4, d = 8 } 每个值需要为2的n次方,保证多个值的组合不会重复. 这样在判断其中一个 ...
 - POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
		
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
 - 趣题: 按二进制中1的个数枚举1~2^n (位运算技巧)
		
; ; k <= n; k++){ << k)-,u = << n; s < u;){ ;i < n;i++) printf(-i)&); print ...
 - hdu4421 2-sat(枚举二进制每一位)
		
题意: 给你一个数组b[][],在给你一些关系,问是否可以找到一个满足限制的a[], 关系如下(图片): 思路: 说到限制,而且还是两个两个之间的限制,那么很容易想到2-sat ...
 - [hdu5340]二分,枚举,二进制压位加速
		
题意:判断一个字符串能否划成三段非空回文串. 思路:先用二分+hash在nlogn的时间内求出以每条对称轴为中心的回文串的最大半径r[i](可以用对称的两个下标之和来表示 ),然后利用r[i]求出pr ...
 - 重温CLR(十一) 枚举类型、位标志和数组
		
枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对.例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum ...
 - 【C#进阶系列】15 枚举类型和位标志
		
实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型. 关于枚举类型 枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护. 枚举类型是值类型,然而有别于其它值类型,枚举类 ...
 - 枚举|标志枚举+|(或)和&(与)运算|类型转换|值类型和引用类型|传参|异常|垃圾回收
		
枚举部分 enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它. 但是,还可以 ...
 - 【CLR Via C#】15 枚举类型与位类型
		
1.基础 枚举类型(enumerated types)定义了一组“符号名称/值”配对. 枚举类型是值类型,每个枚举类型都是从System.Enum派生的,而System.Enum又是从System.V ...
 
随机推荐
- 相克军_Oracle体系_随堂笔记014-锁 latch,lock
			
1.Oracle锁类型 2.行级锁:DML语句 3.表级锁:TM 4.锁的兼容性 5.加锁语句以及锁的释放 6.锁相关视图 7.死锁 1.Oracle锁类型 锁的作用 latch锁:chain ...
 - MySQL学习(二)SQL语句的总结
			
1.连接查询和关联查询连接查询:把两个表中相同的元素的连接就可以查询,使用:where里,select table1.*,table2.* from table1,table2 where table ...
 - JDBC连接MySQL数据库代码模板
			
下面这个例子是最简单的JDBC连接MySQL数据库的例子. 一般步骤: 1.注册驱动: 2.建立连接: 3.创建语句: 4.处理结果: 5.释放资源. 注意: 1.软件开发环境:MyEclipse 8 ...
 - tomcat源码剖析系列
			
一个简单的web服务器 一个简单的servlet容器 连接器 创建httpRequest 创建HttpResponse 容器 生命周期 日志记录器 载入器 Session管理 关闭钩子 启动tomca ...
 - CSS清除浮动
			
今天看到一篇文章关于清除浮动的,突然间脑袋短路了,咦?为什么要清除浮动?原谅我的无知,搜了下原来是这样,又倒腾出原来的笔记,唉,本来就有记录啊,而且也会经常用到,用的久了连原理都忘了.恩,防止自己再犯 ...
 - ASP.NET MVC对WebAPI接口操作(添加,更新和删除)
			
昨天<怎样操作WebAPI接口(显示数据)>http://www.cnblogs.com/insus/p/5670401.html 既有使用jQuery,也有使作HttpClient来从数 ...
 - GBDT的基本原理
			
这里以二元分类为例子,给出最基本原理的解释 GBDT 是多棵树的输出预测值的累加 GBDT的树都是 回归树 而不是分类树 分类树 分裂的时候选取使得误差下降最多的分裂 计算的技巧 最终分裂收益按照下面 ...
 - Linux查看CPU和内存使用情况(转)
			
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...
 - 线程池深入(li)
			
java线程池.在jdk5之后为我们提供了线程池,只需要使用API,不用去考虑线程池里特殊的处理机制.jdk5线程池分好多种,固定尺寸的线程池.可变尺寸连接池等.常用的是ThreadPoolExecu ...
 - 企业商务差旅信息化管理与移动App
			
背景 某航空公司需要到北京某服务提供商公司学习交流,为了节省出行成本让出差员工乘坐公司运营航线,去程路途较远.需要在先乘飞机到天津机场,转地铁后,再乘动车到北京.回程时发生 后补机票失败, ...