• C# Enum设计和使用的相关技巧


    using System;
    using System.Collections;
    public enum SomeRootVegeTables
    {
     Vegetables1,
        Vegetables2,
        Vegetables3,
    }

    public enum Seasons
    {
     None 
    =0,
        Summer 
    = 1,
     Autumn 
    = 2,
     Winter 
    = 4,
     Spring
    = 8,
     All 
    = Summer|Autumn|Winter|Spring,
       
    }


    public class EnumerationSamples
    {
     
    public static void Main()
     
    {
      Hashtable ht 
    = new Hashtable();
      ht[SomeRootVegeTables.Vegetables1] 
    = Seasons.All;
      ht[SomeRootVegeTables.Vegetables2] 
    = Seasons.Spring;
      ht[SomeRootVegeTables.Vegetables3] 
    = Seasons.Autumn|Seasons.Spring;

      Seasons[] seasons 
    = new Seasons[]{Seasons.Winter,Seasons.Spring,Seasons.Summer,Seasons.Autumn};

      
    for(int i=0;i<seasons.Length;i++)
      
    {
       Console.WriteLine(
    "\r\n 下面的蔬菜食用季节为"+seasons[i].ToString());
       
    foreach(DictionaryEntry e in ht)
       
    {
        
    if(((Seasons)e.Value&seasons[i])>0)
        
    {
                      Console.WriteLine(
    "\t"+ ((SomeRootVegeTables)e.Key).ToString());
        }

       }


      }



     }

    }
     

    C#Enum设计的相关指导在网上有相关文章论述:

    英文:Design Guidelines Update: Enum Design

    中文:C# Idioms: Enum还是Enum Class(枚举类)  

    Enum的运算通常涉及到位运算(ANDORXOR),按位运算, 常使用FlagsAttribute 自定义属性定义。FlagsAttribute Enum 的准则:

    • 只有要对数值执行按位运算(ANDORXOR)时才对枚举使用 FlagsAttribute 自定义属性。
    • 2 的幂(即 1248 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。
    • 请考虑为常用标志组合创建一个枚举常量。例如,如果用于文件 I/O 操作的枚举包含枚举常量 Read = 1 Write = 2,请考虑创建枚举常量 ReadWrite = Read OR Write,该常量组合了 Read Write 标志。此外,在某些情况下,可能会将用于组合标志的按位 OR 运算视为一种高级概念,在简单任务中不需要执行此操作。
    • 将负数定义为标志枚举常量时应谨慎,因为很多标志位置都可能设置为 1,这可能使您的代码产生混淆并易于发生代码错误。
    • 测试数值中是否已设置标志的一种简便方法为:在数值和标志枚举常量之间执行按位“与”操作,这种方法会将数值中与标志不对应的所有位都设置为零,然后测试该操作的结果是否等于该标志枚举常量。
    • None 用作值为零的标志枚举常量的名称。在按位 AND 运算中,不能使用 None 枚举常量测试标志,因为所得的结果始终为零。但是,您可以在数值与 None 枚举常量之间执行逻辑(不是按位)比较,以确定数值中是否已设置任何位。
    • 如果创建的是值枚举而不是标志枚举,创建 None 枚举常量仍十分有用。原因是在默认情况下,公共语言运行库会将用于枚举的内存初始化为零。因此,如果不定义值为零的常量,则枚举在创建时将包含非法值。
    • 如果明显存在应用程序需要表示的默认情况,请考虑使用值为零的枚举常量表示默认值。如果不存在默认情况,请考虑使用值为零的枚举常量(这意味着该情况不由任何其他枚举常量表示)。
    • 不要仅为了反映枚举自身的状态而定义枚举值。例如,不要定义仅用于标记枚举末尾的枚举常量。如果需要确定枚举的最后一个值,请显式检查该值。此外,如果枚举常量范围中的所有值都有效,还可以对第一个和最后一个枚举常量执行范围检查。
    • 不要指定保留供将来使用的枚举常量。
    • 在定义采用枚举常量作为值的方法或属性时,应考虑对该值进行验证。原因是即使没有在枚举中定义某个数值,也可以将该数值强制转换为枚举类型。

        

       技巧1:如何去除一个枚举项:

     例如定义了权限Enum Permission

    [Flags]


    public enum Permission{

          Select 
    = 1,

          Edit 
    = 2,

          Delete 
    = 4

          View 
    = 8,    

          All 
    = Select | Edit | Delete | View

      }
      

    可以采用这个函数进行计算:

    public static Permission ClearFlag(Permission value, Permission flag)  

    {        

        value 
    = value & (Permission.All^ flag);

        
    return value;

    }


    来源:http://www.cnblogs.com/shanyou/archive/2006/11/16/562816.aspx
    http://blog.csdn.net/kernellong/archive/2007/03/24/1539893.aspx
  • 相关阅读:
    /tmp 和 /var/tmp 的区别
    PostgreSQL AS不忽略大小写
    PostgreSQL 命令
    DB Stack Overflow
    组合唯一约束
    python3学习笔记(9)_closure
    python3学习笔记(8)_sorted
    python3学习笔记(7)_listComprehensions-列表生成式
    python3学习笔记(6)_iteration
    python3学习笔记(5)_slice
  • 原文地址:https://www.cnblogs.com/yiki/p/758513.html
Copyright © 2020-2023  润新知