【C#进阶系列】15 枚举类型和位标志

实际上本章就只讲枚举类型,由于位标志原本就能够当作一个特殊的枚举类型。数组

关于枚举类型spa

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

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

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

在编译枚举类型时,C#编译器已经将每一个符号转换成了类型的一个常量字段。字符串

C#默认容纳一个枚举类型的值的基础类型为int,而实际上也能够像下面同样自定义:编译器

 enum 英雄类型:byte {
      力量英雄,
      敏捷英雄,
      智力英雄
 }

能够用System.Enum.GetUnderlyingType方法去获取枚举类型的值的基础类型。然而这里只能用一些基元类型,不能用FCL类型。it

一般用的时候除了比较,也只有转换为字符串来查看具体的选项(其它的格式化的输出枚举感受真心用不到的样子,因此这里不列举了):编译

英雄类型 heroType = 英雄类型.力量英雄;
Console.WriteLine(heroType.ToString());//力量英雄

也能够用Enum的静态方法GetValues返回一个数组,里面是Enum的全部选项。class

也能够用Enum的静态方法IsDefined方法去查看枚举类型中,一个值或者其常量值是否被定义了。(然而这很慢,由于里面用了反射)

关于位标志

前面讲到能够将位标志当作一个特殊的枚举类型。

[ComVisible(true)]
    [Flags]
    public enum FileAttributes
    {
        ReadOnly = 1,
        Hidden = 2,
        System = 4,
        Directory = 16,
        Archive = 32,
        Device = 64,
        Normal = 128,
        Temporary = 256,
        SparseFile = 512,
        ReparsePoint = 1024,
        Compressed = 2048,
        Offline = 4096,
        NotContentIndexed = 8192,
        Encrypted = 16384,
        IntegrityStream = 32768,
        NoScrubData = 131072
    }

以上类型中,1的二进制为1,2的二进制为10,4的二进制为100。

也就是说能够用每一个二进制位来确认惟一性,这就是位标志的原理。

var tmp = FileAttributes.ReadOnly | FileAttributes.Hidden;//表示只读且文件隐藏
if ((tmp & FileAttributes.ReadOnly) != 0) {//由于二进制1&1才为1,因此只要存在最后的数值必定不为1
   Console.WriteLine("tmp 只读");
}

查看上面的FileAttributes的定义,会发现有一个[Flags]特性,这个特性的做用就是当tmp.ToString()是"ReadOnly, Hidden"这个字符串。

若是没有[Flags]特性,就会为具体的数值。

上面讲得都是将枚举类型和位标志转换为字符串或者值,将字符串和值转成枚举类型或位标志能够用下面的方法:

Enum.TryParse<FileAttributes>("ReadOnly, Hidden", false, out tmp);//false为忽略大小写,这里为位标志,转枚举类型也差很少
相关文章
相关标签/搜索