• 《CLR via C#》---枚举标志和标志位


    枚举类型

    枚举类型定义了一组符号名称/值配对。

     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
    }
    

    枚举类型使程序更容易编写、阅读和维护;枚举类型是强类型的;枚举类型是值类型。

    每个枚举类型都有一个基础类型,它可以是bytesbyteshortushortint(最常用,也是C#默认选择的)uintlongulong等,不能使用FCL类型。

    internal enum Color:byte{
        White,
        Red,
        Green,
        Blue,
        Orange
    }
    
    //下面代码会显示`System.Byte`
    Console.WriteLine(Enum.GetUnderlyingType(Typeof(Color)));
    

    利用Enum提供的静态ParseTryParse方法,可以很容易的将符号类型转为枚举类型的实例。

    //因为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等。
    可以为枚举类型添加方法,通过使用扩展方法.

    总结

    今天的枚举类型在以前我使用的感觉不多,所以写起来也感觉倒也没有和前面那些一样有些恍然大悟的地方。将来会努力的使用频繁一些。

  • 相关阅读:
    大爽Python入门教程 3-1 布尔值: True, False
    以太坊中的账户、交易、Gas和区块Gas Limit
    全链路压力测试经验
    全链路压力测试
    腾讯大牛教你ClickHouse实时同步MySQL数据
    数据湖和数据仓库的区别?
    第六次作业
    linux CPU实时频率命令
    没有Flash如何做直播
    如何扩展srs并发能力
  • 原文地址:https://www.cnblogs.com/kui0621/p/4928613.html
Copyright © 2020-2023  润新知