《CLR via C#》---枚举标志和标志位
2015-11-01 20:37
453 查看
枚举类型
枚举类型定义了一组
符号名称/值配对。
如
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等。
可以为枚举类型添加
方法,通过使用
扩展方法.
---
总结
今天的枚举类型在以前我使用的感觉不多,所以写起来也感觉倒也没有和前面那些一样有些恍然大悟的地方。将来会努力的使用频繁一些。
相关文章推荐
- C#编写的扫雷游戏
- BC#62C题求二叉树不同节点数的子树的个数
- 2015-10-27 C#3
- C#中静态与非静态方法比较
- C#概述
- Direct3D基础
- 【C#】winform子窗体与父窗体传值,子窗体与子窗体传值
- (抽象)类和接口细节分析
- 学习DataGridViewX
- C#后台做数据存储出现延时、超时的情况
- C#委托(一)
- c# textbox响应回车并且去除“咚”的一声
- C#中关于静态与非静态的一个疑问
- c#入门
- C# 常用接口学习 IComparable 和 IComparer
- debian中配置c#语法高亮的vim编辑器,并使用YouCompleteMe自动补全
- C# 结构体 struct
- c#获取当前日期时间(转)
- C#集合u
- C#学习(一)