《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 ...
随机推荐
- struts2学习笔记--使用Validator校验数据
我们在进行一些操作是需要对用户的输入数据进行验证,比如网站的注册,需要对各个数据项进行数据校验,Struts2提供了一些默认的校验器,比如数字的检测,邮箱的检测,字符串长度的检测等等. 常用的Vali ...
- 数据库SQL Service 2014中文版的安装和配置教程
一.我的电脑环境 1.windows8.1(64位) 2.之前电脑没有安装数据库的软件 二.装机之前准备(我这儿提供百度云保存和下载) 1.下载一个“Sql service 2014中文版” http ...
- hdu FatMouse's Speed 动态规划DP
动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3§ionid ...
- 如何使用SOIL在VS2012的 C++环境下显示图片
先看下效果. 这是一个很无聊的功能....首先说下,我做这个功能的初衷并不是为了实现在控制台中显示图片...(这貌似很无聊) 而是因为自己想做用C做一个游戏:http://q.cnblogs.com/ ...
- JavaScript 获取HTML中的CSS样式的属性以及值的的方法。
<body> <div id="wow" style="font-size:10px; float:left"></div> ...
- ztree + ashx +DataTable +Oracle
问题描述 好久没有使用ztree了,刚才在使用ztree做导航时遇到了几个小问题: 1.返回数据源是undefined . 2.数据出现后树结构没有出现(pIdKey单词拼写错误). 3.在使用Ora ...
- Ueditor 增加模板
简介: Ueditor 是百度出的开源富文本编辑器,非常符合国人习惯!模板功能很好用. 官网:http://ueditor.baidu.com/website/ 定义自己的模板: 先用Ueditor编 ...
- jQuery简洁大方的登录页面模板
jQuery+CSS网站登录模板本模板带验证码 在线体验:http://hovertree.com/texiao/jquery/13.htm Demo 2:http://hovertree.com/h ...
- VS 常用快捷键
区域代码选择:按Shift选择整(行)块代码,可配合四个方向键(左右键:选择单个字符,上下键:上下行的当前列).Home(当前行首).End(当前行尾).PgUp(当前页首)和PgDn(当前页尾)使用 ...
- 【NopCommerce源码架构学习-二】单例模式实现代码分析
单例模式是是常用经典十几种设计模式中最简单的..NET中单例模式的实现也有很多种方式.下面我来介绍一下NopCommerce中单例模式实现. 我之前的文章就分析了一下nop中EngineContext ...