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

关于枚举类型

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

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

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

在编译枚举类型时,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. ECMAScript5 Array新增方法

    数组在各个编程语言中的重要性不言而喻,但是在之前的JavaScript中数组(JavaScript 数组详解)虽然功能已经很强大,但操作方法并不完善,在ECMAScript5中做了适当的补充. Arr ...

  2. lua table序列化和反序列化

    function serialize(obj) local lua = "" local t = type(obj) if t == "number" then ...

  3. settimeout里面函数有无双引号的区别

    在写定时器时很容易搞混,所以记下防止忘记. 双引号中的作用域不捕捉局部变量,不用双引号包着的是捕捉局部作用域 var a = function() { alert(1111) } function a ...

  4. pycharm快捷键 - 官方全

    pycharm快捷键 - 官方全 Ctrl + F12 显示文件内的成员,继承的成员

  5. IDE:Eclipse查看Servlet源码

    一.源码下载 1.打开tomcat官网:http://tomcat.apache.org/    , 点击右侧下载菜单(以tomcat-7为例)进入下载页面:http://tomcat.apache. ...

  6. 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  7. 用实例讲解Spark Sreaming--转

    原文地址:http://www.infoq.com/cn/articles/spark-sreaming-practice 本篇文章用Spark Streaming +Hbase为列,Spark St ...

  8. Cordova webapp实战开发:(7)如何通过简单的方法做到,不重新发布APP来修复bug、增加功能、或者躲开苹果的一些严格审核?

    到<Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?>为止,我们已经大体学会了如何使用Cordova了,那些都是使用Cordova的开发者必备的技能. ...

  9. eclipse中断点调试debug

    几乎没有用过debug模式,每次想要知道结果都是sysou一下.记得曾经问乱码问题,jfinal说打断点调试看在哪里出错.简单记下普通调试. 1.在需要查看的地方打断点,方法是在行号右侧双击. 2.运 ...

  10. java中String的相等比较

    首先贴出测试用例: package test; import org.junit.Test; /** * Created by Administrator on 2015/9/16. * */ pub ...