【C#进阶系列】15 枚举类型和位标志
实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型。
关于枚举类型
枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护。
枚举类型是值类型,然而有别于其它值类型,枚举类型不能定义任何方法。除非用扩展方法。
然而正如我之前说到的,也许当你想用扩展方法的时候可以先考虑一下这个地方是否还适合用枚举类型,又或者这个方法是否适合加在这个枚举类型中。
在编译枚举类型时,C#编译器已经将每个符号转换成了类型的一个常量字段。
C#默认容纳一个枚举类型的值的基础类型为int,而实际上也可以像下面一样自定义:
enum 英雄类型:byte {
力量英雄,
敏捷英雄,
智力英雄
}
可以用System.Enum.GetUnderlyingType方法去获取枚举类型的值的基础类型。然而这里只能用一些基元类型,不能用FCL类型。
通常用的时候除了比较,也只有转换为字符串来查看具体的选项(其它的格式化的输出枚举感觉真心用不到的样子,所以这里不列举了):
英雄类型 heroType = 英雄类型.力量英雄;
Console.WriteLine(heroType.ToString());//力量英雄
也可以用Enum的静态方法GetValues返回一个数组,里面是Enum的所有选项。
也可以用Enum的静态方法IsDefined方法去查看枚举类型中,一个值或者其常量值是否被定义了。(然而这很慢,因为里面用了反射)
关于位标志
前面讲到可以将位标志当做一个特殊的枚举类型。
[ComVisible(true)]
[Flags]
public enum FileAttributes
{
ReadOnly = ,
Hidden = ,
System = ,
Directory = ,
Archive = ,
Device = ,
Normal = ,
Temporary = ,
SparseFile = ,
ReparsePoint = ,
Compressed = ,
Offline = ,
NotContentIndexed = ,
Encrypted = ,
IntegrityStream = ,
NoScrubData =
}
以上类型中,1的二进制为1,2的二进制为10,4的二进制为100。
也就是说可以用每个二进制位来确认唯一性,这就是位标志的原理。
var tmp = FileAttributes.ReadOnly | FileAttributes.Hidden;//表示只读且文件隐藏
if ((tmp & FileAttributes.ReadOnly) != ) {//因为二进制1&1才为1,所以只要存在最后的数值一定不为1
Console.WriteLine("tmp 只读");
}
查看上面的FileAttributes的定义,会发现有一个[Flags]特性,这个特性的作用就是当tmp.ToString()是"ReadOnly, Hidden"这个字符串。
如果没有[Flags]特性,就会为具体的数值。
上面讲得都是将枚举类型和位标志转换为字符串或者值,将字符串和值转成枚举类型或位标志可以用下面的方法:
Enum.TryParse<FileAttributes>("ReadOnly, Hidden", false, out tmp);//false为忽略大小写,这里为位标志,转枚举类型也差不多
【C#进阶系列】15 枚举类型和位标志的更多相关文章
- [CLR via C#]15. 枚举类型和位标志
一.枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对. 例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal en ...
- 重温CLR(十一) 枚举类型、位标志和数组
枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对.例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum ...
- <NET CLR via c# 第4版>笔记 第15章 枚举类型和位标志
15.1 枚举类型 枚举定义的符号是常量值. C#编译器编译时,会用数值替换符号,不再引用定义了符号的枚举类型.可能会出现一些版本问题. Enum.IsDefined(Type enumType, o ...
- 【CLR Via C#】15 枚举类型与位类型
1.基础 枚举类型(enumerated types)定义了一组“符号名称/值”配对. 枚举类型是值类型,每个枚举类型都是从System.Enum派生的,而System.Enum又是从System.V ...
- Java基础教程(15)--枚举类型
枚举类型定义了一个枚举值的列表,每个值是一个标识符.例如,下面的语句声明了一个枚举类型,用来表示星期的可能情况: public enum Day { SUNDAY, MONDAY, TUESDAY ...
- 【C#进阶系列】06 类型和成员基础
这些东西是基础中的基础,基本上是本书都会讲这个.但是很多东西到处都有,所以只捡了以下的这些写下来. 关于类型的可见性和可访问性 也就是public,internal这种东西,但是还是有个东西要提一下, ...
- 【C#进阶系列】04 类型基础
关于System.Object 所有类型都从System.Object派生而来. System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后 ...
- WorldWind源码剖析系列:枚举类型
PluginSDK中的枚举型主要有以下这些: public enum AltitudeMode//高度模式枚举 { ClampedToGround,//强制到地面模式 RelativeToGround ...
- [WPF系列]-DataBinding 枚举类型数据源
public class EnumerationDataProvider : ObjectDataProvider { public Type EnumerationType { get; set; ...
随机推荐
- java 堆栈分析2
有了mat.同时我们发现Java有提供jvisualvm, jvisualvm是一个不错的工具: heap dump . thread dump. cpu/mem profile 无所不能. 不过观察 ...
- jmx : ClientCommunicatorAdmin Checker-run
今天遇到一个问题: 执行bat,关闭jmx的时候,由于程序关闭之后又去连接了一次,cmd窗口报错,类似: 2013-7-11 15:58:05 ClientCommunicatorAdmin rest ...
- NodeJS系列~第二个小例子,解决中文乱码的问题
返回目录 为了使页面支持的字符更多,所以编码使用UTF-8,注意,你的原js文件的编码也要是utf-8的,可以通过记事本进行编码的修改
- 知方可补不足~Sqlserver发布订阅与sql事务的关系
回到目录 前几讲说了一下通过sqlserver的发布与订阅来实现数据的同步,再通过EF这个ORM架构最终实现架构系统的读写分离,而在使用发布与订阅来实现数据同步时,需要我们注意几点,那就是当操作被使用 ...
- 树形打印lua table表
为方便调试lua程序,往往想以树的形式打印出一个table,以观其表内数据.以下罗列了三种种关于树形打印lua table的方法;法一 local print = print local tconca ...
- paip.解决access出现 -2147467259 无效的参数量
paip.解决access出现 -2147467259 无效的参数量 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http: ...
- VS2012 easyui datagrid url访问之坑
VS2012 easyui datagrid url访问之坑 url属性放的是地址的话 返回的json格式必须有 total 和 rows,如下: {"total":2," ...
- VS2012 MVC4 学习笔记-概览
1. 访问请求过程 访问收到后路由(Router)根据路径由分配给对应的控制器(Control),然后由控制器返回页面视图(View) 路由设置一个默认的控制器,类似 主页的样子吧 <未完待续& ...
- 每天一个linux命令(36):diff 命令
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...
- SQL Server 错误日志收缩(ERRORLOG)
一.基础知识 默认情况下,错误日志位于 : C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG 和ERRORLOG.n 文 ...