枚举类型

枚举类型定义了一组符号名称/值配对。

 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
}

枚举类型使程序更容易编写、阅读和维护;枚举类型是强类型的;枚举类型是值类型。

每个枚举类型都有一个基础类型,它可以是bytesbyteshortushortint(最常用,也是C#默认选择的)uintlongulong等,不能使用FCL类型。

internal enum Color:byte{
White,
Red,
Green,
Blue,
Orange
} //下面代码会显示`System.Byte`
Console.WriteLine(Enum.GetUnderlyingType(Typeof(Color)));

利用Enum提供的静态ParseTryParse方法,可以很容易的将符号类型转为枚举类型的实例。

//因为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#》---枚举标志和标志位的更多相关文章

  1. C# 枚举的flags 标志位应用

    枚举有个特性叫标志位,使用方法如下 [Flags] enum Foo { a =1, b = 2, c = 4, d = 8 } 每个值需要为2的n次方,保证多个值的组合不会重复. 这样在判断其中一个 ...

  2. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  3. 趣题: 按二进制中1的个数枚举1~2^n (位运算技巧)

    ; ; k <= n; k++){ << k)-,u = << n; s < u;){ ;i < n;i++) printf(-i)&); print ...

  4. hdu4421 2-sat(枚举二进制每一位)

    题意:       给你一个数组b[][],在给你一些关系,问是否可以找到一个满足限制的a[], 关系如下(图片): 思路:       说到限制,而且还是两个两个之间的限制,那么很容易想到2-sat ...

  5. [hdu5340]二分,枚举,二进制压位加速

    题意:判断一个字符串能否划成三段非空回文串. 思路:先用二分+hash在nlogn的时间内求出以每条对称轴为中心的回文串的最大半径r[i](可以用对称的两个下标之和来表示 ),然后利用r[i]求出pr ...

  6. 重温CLR(十一) 枚举类型、位标志和数组

    枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对.例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum ...

  7. 【C#进阶系列】15 枚举类型和位标志

    实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型. 关于枚举类型 枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护. 枚举类型是值类型,然而有别于其它值类型,枚举类 ...

  8. 枚举|标志枚举+|(或)和&(与)运算|类型转换|值类型和引用类型|传参|异常|垃圾回收

    枚举部分 enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它. 但是,还可以 ...

  9. 【CLR Via C#】15 枚举类型与位类型

    1.基础 枚举类型(enumerated types)定义了一组“符号名称/值”配对. 枚举类型是值类型,每个枚举类型都是从System.Enum派生的,而System.Enum又是从System.V ...

随机推荐

  1. 相克军_Oracle体系_随堂笔记014-锁 latch,lock

    1.Oracle锁类型 2.行级锁:DML语句 3.表级锁:TM 4.锁的兼容性 5.加锁语句以及锁的释放 6.锁相关视图 7.死锁 1.Oracle锁类型 锁的作用     latch锁:chain ...

  2. MySQL学习(二)SQL语句的总结

    1.连接查询和关联查询连接查询:把两个表中相同的元素的连接就可以查询,使用:where里,select table1.*,table2.* from table1,table2 where table ...

  3. JDBC连接MySQL数据库代码模板

    下面这个例子是最简单的JDBC连接MySQL数据库的例子. 一般步骤: 1.注册驱动: 2.建立连接: 3.创建语句: 4.处理结果: 5.释放资源. 注意: 1.软件开发环境:MyEclipse 8 ...

  4. tomcat源码剖析系列

    一个简单的web服务器 一个简单的servlet容器 连接器 创建httpRequest 创建HttpResponse 容器 生命周期 日志记录器 载入器 Session管理 关闭钩子 启动tomca ...

  5. CSS清除浮动

    今天看到一篇文章关于清除浮动的,突然间脑袋短路了,咦?为什么要清除浮动?原谅我的无知,搜了下原来是这样,又倒腾出原来的笔记,唉,本来就有记录啊,而且也会经常用到,用的久了连原理都忘了.恩,防止自己再犯 ...

  6. ASP.NET MVC对WebAPI接口操作(添加,更新和删除)

    昨天<怎样操作WebAPI接口(显示数据)>http://www.cnblogs.com/insus/p/5670401.html 既有使用jQuery,也有使作HttpClient来从数 ...

  7. GBDT的基本原理

    这里以二元分类为例子,给出最基本原理的解释 GBDT 是多棵树的输出预测值的累加 GBDT的树都是 回归树 而不是分类树 分类树 分裂的时候选取使得误差下降最多的分裂 计算的技巧 最终分裂收益按照下面 ...

  8. Linux查看CPU和内存使用情况(转)

    在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...

  9. 线程池深入(li)

    java线程池.在jdk5之后为我们提供了线程池,只需要使用API,不用去考虑线程池里特殊的处理机制.jdk5线程池分好多种,固定尺寸的线程池.可变尺寸连接池等.常用的是ThreadPoolExecu ...

  10. 企业商务差旅信息化管理与移动App

    背景       某航空公司需要到北京某服务提供商公司学习交流,为了节省出行成本让出差员工乘坐公司运营航线,去程路途较远.需要在先乘飞机到天津机场,转地铁后,再乘动车到北京.回程时发生 后补机票失败, ...