实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型。

关于枚举类型

枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护。

枚举类型是值类型,然而有别于其它值类型,枚举类型不能定义任何方法。除非用扩展方法。

然而正如我之前说到的,也许当你想用扩展方法的时候可以先考虑一下这个地方是否还适合用枚举类型,又或者这个方法是否适合加在这个枚举类型中。

在编译枚举类型时,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 枚举类型和位标志的更多相关文章

  1. [CLR via C#]15. 枚举类型和位标志

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

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

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

  3. <NET CLR via c# 第4版>笔记 第15章 枚举类型和位标志

    15.1 枚举类型 枚举定义的符号是常量值. C#编译器编译时,会用数值替换符号,不再引用定义了符号的枚举类型.可能会出现一些版本问题. Enum.IsDefined(Type enumType, o ...

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

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

  5. Java基础教程(15)--枚举类型

      枚举类型定义了一个枚举值的列表,每个值是一个标识符.例如,下面的语句声明了一个枚举类型,用来表示星期的可能情况: public enum Day { SUNDAY, MONDAY, TUESDAY ...

  6. 【C#进阶系列】06 类型和成员基础

    这些东西是基础中的基础,基本上是本书都会讲这个.但是很多东西到处都有,所以只捡了以下的这些写下来. 关于类型的可见性和可访问性 也就是public,internal这种东西,但是还是有个东西要提一下, ...

  7. 【C#进阶系列】04 类型基础

    关于System.Object 所有类型都从System.Object派生而来. System.Object的公共方法中ToString()一般是返回对象的类型的全名,只有Int32这些类型将其重写后 ...

  8. WorldWind源码剖析系列:枚举类型

    PluginSDK中的枚举型主要有以下这些: public enum AltitudeMode//高度模式枚举 { ClampedToGround,//强制到地面模式 RelativeToGround ...

  9. [WPF系列]-DataBinding 枚举类型数据源

    public class EnumerationDataProvider : ObjectDataProvider { public Type EnumerationType { get; set; ...

随机推荐

  1. osgi dm

    看了http://developer.51cto.com/art/200909/154863.htm 真心感到,最强大最有组织的技术网站还是 51cto,牛人应该也是最多的. 以前逛51cto的比较少 ...

  2. 知方可补不足~SQL为大数据引入分区表

    回到目录 一些概念 分区表在oracle和sqlserver中都上存在的,当数据表的数据量过大时,上千万,上亿的数据,在进行数据查询时需要显得比较慢,性能很差,这时是时候引入分区表了,分区表顾名思义, ...

  3. 1121冬至!!!巩固HTML基础第一堂

    今天只是把以前的知识巩固了一下.温故而知新,说的一点没错: 又新明白了一种居中对齐方法: 水平居中:align left(左侧对齐),center(居中对齐) 垂直居中:ralign top(上对齐) ...

  4. 新特性AAtitti css3 新特性attilax总结titti css

    Atitti css3 新特性attilax总结 图片发光效果2 透明渐变效果2 文字描边2 背景拉伸2 CSS3 选择器(Selector)4 @Font-face 特性7 Word-wrap &a ...

  5. c#设计模式-命令模式

    一. 命令(Command)模式 命令(Command)模式属于对象的行为模式[GOF95].命令模式又称为行动(Action)模式或交易(Transaction)模式.命令模式把一个请求或者操作封装 ...

  6. JSON和JSONP的区别

    先前的概念中对JSON还是比较熟悉,对JSONP不是特别的清楚,整理完相关知识发现才豁然开朗.简单的说JSON是一种数据交换格式,而JSONP是 一种非官方跨域数据交互协议.JSON是“暗号”,而JS ...

  7. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)

    Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...

  8. 关于页面查询多数据查询问题(foreach)

    最近纠结的一个问题,就是页面综合查询总报错,之前用过传参用list传就没问题,但现在用map总是报错,缓释直接贴图吧,希望对遇到问题的朋友有帮助页面传来参数,之前是 这样写的,直接将拿来的数据封装成一 ...

  9. Java 线程 — AbstractQueuedSynchronizer

    锁 锁就是一种状态,比如互斥锁:同一时间只能有一个线程拥有,可以使用一个整型值来标志当前的状态 0:表示没有现成占有锁 1:表示锁已经被占用 AbstractQueuedSynchronizer 实现 ...

  10. OpenCascade BRep Format Description (2)

    OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...