zoukankan      html  css  js  c++  java
  • Flags

    [Flags]
    public enum ClientStates
    {
      Ordinary=0,        // 0000
      HasDiscount=1,     // 0001
      IsSupplier=2,      // 0010
      IsBlackListed=4,   // 0100
      IsOverdrawn=8      // 1000
    上述定义,实际上是每个不同的枚举成员都指定了某一个Bit的位置信息。它们之间的关系大体上是 *2的关系(除了第一个为0外)。
    而如果你不强制定义这个值编译器生成的枚举类型值为:
    [Flags]
    public enum ClientStates
    {
      Ordinary=0,        // 0000
      HasDiscount=1,     // 0001
      IsSupplier=2,      // 0010
      IsBlackListed=3,   // 0011
      IsOverdrawn=4      // 0100

    FlagsAttribute 类

    位域通常用于由可组合出现的元素组成的列表,而枚举常数通常用于由互相排斥的元素组成的列表。 因此,位域设计为通过按位“或”运算组合来生成未命名的值,而枚举常数则不是。 语言在对位域的使用和对枚举常数的使用上不同。

    FlagsAttribute 的特性

    AttributeUsageAttribute 应用于此类,其 Inherited 属性指定 false 此特性只能应用于枚举。

    用于 FlagsAttribute 和 Enum 的准则

    • 只有要对数值执行按位运算(AND、OR、XOR)时才对枚举使用 FlagsAttribute 自定义属性。

    • 用 2 的幂(即 1、2、4、8 等)定义枚举常量。 这意味着组合的枚举常量中的各个标志都不重叠。

    • 请考虑为常用标志组合创建一个枚举常量。 例如,如果有一个用于文件 I/O 操作的枚举包含枚举常量 Read = 1 和 Write = 2,请考虑创建枚举常量 ReadWrite = Read OR Write,该枚举常量将 Read 和 Write 标志组合在一起。 此外,在某些情况下,可能会将用于组合标志的按位 OR 运算视为一种高级概念,在简单任务中不需要执行此操作。

    • 将负数定义为标志枚举常量时应谨慎,因为很多标志位置都可能设置为 1,这可能使您的代码产生混淆并易于发生代码错误。

    • 测试数值中是否已设置标志的一种简便方法为:在数值和标志枚举常量之间执行按位"与"操作,这种方法会将数值中与标志不对应的所有位都设置为零,然后测试该操作的结果是否等于该标志枚举常量。

    • 将 None 用作值为零的标志枚举常量的名称。 在按位 AND 运算中,不能使用 None 枚举常量测试标志,因为所得的结果始终为零。 但是,您可以在数值与 None 枚举常量之间执行逻辑(不是按位)比较,以确定数值中是否已设置任何位。

      如果创建的是值枚举而不是标志枚举,创建 None 枚举常量仍十分有用。 原因是在默认情况下,公共语言运行时会将用于枚举的内存初始化为零。 因此,如果不定义值为零的常量,则枚举在创建时将包含非法值。

      如果明显存在应用程序需要表示的默认情况,请考虑使用值为零的枚举常量表示默认值。 如果不存在默认情况,请考虑使用值为零的枚举常量(这意味着该情况不由任何其他枚举常量表示)。

    • 不要定义只映射枚举本身状态的枚举值。 例如,不要定义只标记枚举末尾的枚举常量。 如果需要确定枚举的最后一个值,请显式检查该值。 此外,如果枚举常量范围中的所有值都有效,还可以对第一个和最后一个枚举常量执行范围检查。

    • 不要指定保留供以后使用的枚举常量。

    • 在定义采用枚举常量作为值的方法或属性时,应考虑对该值进行验证。 原因是即使数值未在枚举中定义,也可以将数值强制转换为枚举类型。

    // Example of the FlagsAttribute attribute.
    using System;
    
    class FlagsAttributeDemo
    {
        // Define an Enum without FlagsAttribute.
        enum SingleHue : short
        {
            Black = 0,
            Red = 1,
            Green = 2,
            Blue = 4
        };
    
        // Define an Enum with FlagsAttribute.
        [FlagsAttribute] 
        enum MultiHue : short
        {
            Black = 0,
            Red = 1,
            Green = 2,
            Blue = 4
        };
    
        static void Main( )
        {
            Console.WriteLine( 
                "This example of the FlagsAttribute attribute 
    " +
                "generates the following output." );
            Console.WriteLine( 
                "
    All possible combinations of values of an 
    " +
                "Enum without FlagsAttribute:
    " );
    
            // Display all possible combinations of values.
            for( int val = 0; val <= 8; val++ )
                Console.WriteLine( "{0,3} - {1}", 
                    val, ( (SingleHue)val ).ToString( ) );
    
            Console.WriteLine( 
                "
    All possible combinations of values of an 
    " +
                "Enum with FlagsAttribute:
    " );
    
            // Display all possible combinations of values.
            // Also display an invalid value.
            for( int val = 0; val <= 8; val++ )
                Console.WriteLine( "{0,3} - {1}", 
                    val, ( (MultiHue)val ).ToString( ) );
        } 
    } 
    
    /*
    This example of the FlagsAttribute attribute
    generates the following output.
    
    All possible combinations of values of an
    Enum without FlagsAttribute:
    
      0 - Black
      1 - Red
      2 - Green
      3 - 3
      4 - Blue
      5 - 5
      6 - 6
      7 - 7
      8 - 8
    
    All possible combinations of values of an
    Enum with FlagsAttribute:
    
      0 - Black
      1 - Red
      2 - Green
      3 - Red, Green
      4 - Blue
      5 - Red, Blue
      6 - Green, Blue
      7 - Red, Green, Blue
      8 - 8
    */
     
  • 相关阅读:
    MySQL补充
    不同操作系统下虚拟环境的搭建
    Python导学基础(二)变量与基础数据类型
    Python导学基础(一)介绍
    KM 算法
    题解-CF1065E Side Transmutations
    题解-CF1140E Palindrome-less Arrays
    题解-CF677D Vanya and Treasure
    splay文艺平衡树
    splay区间操作(bzoj1500)
  • 原文地址:https://www.cnblogs.com/netmvc8/p/3515587.html
Copyright © 2011-2022 走看看