`
rl784rl
  • 浏览: 12578 次
最近访客 更多访客>>
社区版块
存档分类

enum总结

 
阅读更多

enum总结
2011年03月11日
  125
  10 20 50
  100
  flag 125解决掉(123456789)
  元素的组合方式有两种:
  a b c (a,b,c)分隔符
  1 2 4 (7)枚举的组合
  我的另外一篇文章:
  枚举转换集合,flagAttribute的意义
  http://blog.csdn.net/cxzhq2002/archive/2010/05/10/ 5575980.aspx
  enum的组合用法,可解决用少量的枚举值解决大量的枚举值的作用。采用位域方式计算。
  C#在使用时有些小的技巧:
  位域通常用于由可组合出现的元素组成的列表,而枚举常数通常用于由互相排斥的元素组成的列表。因此,位域设计为通过按位"或"运算组合来生成未命名的值,而枚举常数则不是。语言在对位域的使用和对枚举常数的使用上不同。 AttributeUsageAttribute 应用于此类,其 Inherited 属性指定 false。此属性只能应用于枚举。 只有要对数值执行按位运算(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 枚举常量仍十分有用。原因是在默认情况下,公共语言运行库会将用于枚举的内存初始化为零。因此,如果不定义值为零的常量,则枚举在创建时将包含非法值。  如果明显存在应用程序需要表示的默认情况,请考虑使用值为零的枚举常量表示默认值。如果不存在默认情况,请考虑使用值为零的枚举常量(这意味着该情况不由任何其他枚举常量表示)。  不要仅为了反映枚举自身的状态而定义枚举值。例如,不要定义仅用于标记枚举末尾的枚举常量。如果需要确定枚举的最后一个值,请显式检查该值。此外,如果枚举常量范围中的所有值都有效,还可以对第一个和最后一个枚举常量执行范围检查。  不要指定保留供将来使用的枚举常量。 在定义采用枚举常量作为值的方法或属性时,应考虑对该值进行验证。原因是即使没有在枚举中定义某个数值,也可以将该数值强制转换为枚举类型。  以下转,没细看
  在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,性别只有男跟女等等。如果把这些量说明为整型、字符型或其它类型显然是不妥当的。为此,C#提供了一种称为"枚举"的类型。在"枚举"类型的定义中列举出所有可能的取值,被说明为该"枚举"类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
  1、定义枚举
  定义枚举很简单,直接使用enum关键字声明即可,例如定义性别的枚举,性别只有男和女 publicenum Sex
  {
  女 =0,//'0'是'女'对应的内部表示,也可以说是女的Value,'女'是外部表示,也可以说是Name
  男 =1,
  }
  2.使用枚举 
  
  1publicvoid UseEnum()
  2 {
  3//获取枚举对应的值
  4 int enumValue = (int)Sex.男;//enumValue的值则为 1
  5
  6//获取枚举的名称
  7 string enumText = Sex.男.ToString();//enumText的值则为男
  8
  9//将int类型值转换为对应的枚举
  10 int intValue =1;//int值
  11  Sex sex = (Sex)intValue;//sex则为对应男的枚举
  12
  13//将名称转换为对应的枚举
  14 string strValue ="男";
  15 sex = (Sex)Enum.Parse(typeof(Sex), strValue);//sex则为对应男的枚举
  16
  17//判断int值或名称是否在枚举定义项类
  18 if (Enum.IsDefined(typeof(Sex), intValue))//第二个参数也可以传入strValue
  19  {
  20//有
  21  }
  22
  23//switch来判断sex (小技巧:先输入switch 再加两个Tab键 ,然后再switch()
  24//里面输入枚举,再回车键,代码段就会自动的将枚举所有项加上case)
  25 switch (sex)
  26 {
  27case Sex.女:
  28break;
  29case Sex.男:
  30break;
  31default:
  32break;
  33 }
  34//........................
  35  }
  3.通常我们在数据库中,很多的一些状态、类型、性别等等字段保存的是数字,但我们在开发时需要判断这些状态时,直接使用 if(UserInfo.Sex==0)这种方式来判断,显然不太好,如果状态多时,自己都难分辨哪个数字代表什么状态。并且代码也不可观,我们在写代码时应该尽量少写硬代码。如果使用枚举定义,数据库存储的枚举对应的值,而在写代码时使用枚举的名称,这样一看代码就知道数据库储值的是什么状态。非常清楚明了。
  4.UI层显示枚举的名称。如果数据库存储的是枚举的值(为数字),而在UI上当然不能已数字的方式显示,应该显示对应的枚举名称。例如在一个用户信息列表中需要绑定用户性别(枚举为上述的Sex),那该如何显示枚举的名称呢?一下提供多种方式
  3.1:GridView控件绑定数据源为例,可以添加一列模板项,通过值获取枚举名称 
  
  3.2:  通过Enum对象获取名称 
  
  还有很多方式来处理这个问题,大家可以自由选择。
  5.枚举的'高级用法'组合运用:例如一个界面里有:增、删、查、改等操作,但对应不同用户就有不同操作权限。例如A用户只能增、删,而B用户只能查、改等等。如果在权限表中某一个字段类型指定用户的操作权限时,问题就出来了。来看看一下3种解决方式:
  1.每个操作权限一条数据,缺点:每次更改权限时,避免不了删除和新增,并且数据量庞大,如果一个用户有一千权限就代表有一千条数据,那这张表的数据就不敢想象了。
  2.一个字段存储所有的操作权限,每个操作权限使用 某个指定的符号作为分隔符,这种方式叫简单、方便。
  3.就是使用我们的枚举组合,在一个字段存储所有的操作权限,但值只为一个数,不像方式2使用分隔符分开。
  当然,还有很多方式可以解决这种问题。我们现在就来看看如何使用枚举组合来代表多个操作权限。
  5.1:定义一个操作权限枚举:  [Flags]//必须打上一个标记,打上这个标记系统才能识别这个枚举可使用组合方式
  publicenum Role
  {
  未分配=0,
  删除数据 =1,
  修改数据 =2,
  新增数据 =4,
  查看数据 =8,
  }
  5.2:如果用户有删除、修改的权限在枚举定义中只有1和2的枚举,那怎么将这两个枚举值组合成一个枚举值存储到数据库呢?很简单,看一下代码: int allRole = ((int)Role.删除数据) + ((int)Role.修改数据);
  //这时allRole的值为3 (两个枚举对应值相加:1+2=3),这时直接将allRole值存储到数据就可以了
  
  Role myAllRole = (Role)allRole;//将int值强制转换为枚举
  //此时,myAllRole的名称为 ' 删除数据, 修改数据 ' ,值为3
  //判断是否有删除权限
  if ((myAllRole & Role.删除数据) == Role.删除数据)
  {
  //有
  }
  注意此处使用了 位算符& 方式来获取判断,关于位算符的使用在此就不讲了。组合运用大概就是这样。必须注意的地方就是枚举值的定义,我们可以看到Role枚举的定义值的规律,0到1,1到2,2到4,4到8,8到16......当前的值为上个值的2次方,为什么要这样定义呢?是因为任何的组合都可以在枚举范围中某几个值的总和,例如组合值为15,那15就等于枚举定义范围里的定义值为1、2、4、8相加,15=1+2+4+8。只有按规律定义值,就可以组合成任意数。
  组合必须注意的几点:
  1.枚举定义时,必须打上[Flags]标记,系统才会根据这个标记来决定这个枚举是否可组合使用
  2.定义枚举的值必须按以上所说的规律定义,例如:0、1、2、4、8、16、32.......也可以使用3次方的方式,例如:0、3、6、12、24..........
  6.使用优点总结
  1.规则性:例如数据库某个字段的值只在1、2、3、4,例如状态,当我们在录入数据时,我们可以从枚举中取值,这样避免了这个字段出现其它值,同时也使代码更容易理解,因为在取值时,我们是拿枚举定义的名称,名称是我们自定义的易理解的中文或英文。
  2.易解性:就是上述所说的,枚举名称是用中文和英文来定义,在使用时,则拿枚举的名称,这样一看代码就知道。而不会在代码中写1、2、3、4这样的数字,也许过段时间自己写的都忘了了1代表什么?2代表什么?了,更何况日后他人的维护呢。
  还有很多优点。希望大家能更好的用好枚举,上述某些地方讲述的不够清楚,如有需要进步的了解的朋友可以加我Q,大家一起互相学习。QQ:554044818
分享到:
评论

相关推荐

    javaenum(枚举)使用详解+总结.pdf

    javaenum(枚举)使用详解+总结.pdf

    python模拟enum枚举类型的方法小结

    本文实例总结了python模拟enum枚举类型的方法。分享给大家供大家参考。具体分析如下: python中没有enum枚举类型,可能python认为这玩意压根就没用,下面列举了三种方法模拟enum枚举类型 方法1. 使用自定义类 class...

    三分钟快速掌握Java中枚举(enum)

    enum的全称为enumeration, 是 JDK 1.5中引入的新特性,存放在 java....下面这篇文章是我在使用enum过程中的一些经验和总结,分享出来方便大家快速的掌握Java中枚举(enum),有需要的朋友们下面跟着小编来一起看看吧。

    java 枚举类总结

    java 枚举类总结 enum

    关于typedef的用法总结

    关于typedef的用法总结,和宏定义Define的一些区别

    Java基础知识点总结.docx

    枚举:关键字 enum 86 自动拆装箱 86 泛型 87 <java.lang>System 89 <java.lang>Runtime 90 <java.lang>Math 90 <java.lang>.Date:日期类,月份从0—11 92 <java.lang> Calendar:日历类 93 十六、 IO流:用于处理...

    网络编程总结(IOS)

    网上收集的ios 网络编程总结。 开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审(我们的)查的。 Apple 的 例程 Reachability 中介绍了取得/检测网络状态...

    C语言中枚举与指针的实例详解

     总结一下, 定义枚举,用typedef enum关键字, 比如 typedef enum{Red,Green,Blue} Color3;  枚举到数值的转换,如果没有指定代表数值就是从0开始算, 比如 Color3 c=Red; printf(“%d”,c);会显示0, 除非指定 如...

    enum-comparison:比较不同语言的枚举和类似功能

    以下调查旨在合理合理地概述和总结可用语言。 最后包括我自己的想法和分析。 对于某些语言,我已经在相应的子目录中包含了可运行的示例代码。 是否有示例代码主要取决于我是否已经为该语言安装了运行时。 我故意...

    C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法,这里自己做下总结: 1.枚举类型 代码如下: //遍历枚举类型Sample的各个枚举名称 foreach (string sp in Enum.GetNames(typeof(Sample))) { ary.Add(sp); } //遍历枚举类型Sample的各个...

    C++ 基础知识总结_终稿_1241

    C++ 基础知识总结目录C++ 面试基础知识总结 1位域 5C 实现 C++ 类 7friend 友元类和友元函数 8:: 范围解析运算符 9enum 枚举类型

    枚举的用法详细总结

    1、枚举enum的用途浅例写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等。更常见的,打开一个文件可能有三种状态:input, output和...

    阿里 java 开发手册/规范

    阿里 java 开发手册/规范 非常不错的开发规范,《阿里巴巴Java开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者。...

    C学习深入学习总结

    C语言各种常用关键字详细解释学习,都是总结面试,都是比较好的笔试题。 1 变量 3 1.1 全局变量,局部变量,,常量分别保存在内存中的什么地方? 3 1.2 不同类型的变量,你是否知道其作用域? 3 1.3 全局变量和局部...

    PHP 枚举类型的管理与设计知识点总结

    class BoolEnum { const YES = '是'; const NO = '否'; } 现在,我们希望能通过方法来动态调用对应的枚举类型 BoolEnum::YES(); // 是 BoolEnum::NO(); // 否 也可以批量获取枚举类型 BoolEnum::toArray(); // ...

    java语言程序设计 java编程笔记 由浅入深的笔记 共32份 全套资源.rar

    【完整课程列表】 API集合.docx clone.docx Date日期.docx GC垃圾回收机制.docx ...枚举enum.docx 设计模式.docx 数组.docx 网络编程.docx 线程和内部类.docx 循环和类对象.docx 异常.docx 正则表达式.docx 总结.docx

    10道常用的Swift面试题(附答案).md

    1、Swift和Objective-C有什么区别? 1)Swift是强类型(静态)语言,有类型推断,Objective-C...2)Swift派发机制总结: Swift中所有ValueType(值类型:Struct、Enum)使用直接派发; Swift中协议的Extensions使用直

    10道常用的Swift面试题(附答案)

    1、Swift和Objective-C有什么区别? 1)Swift是强类型(静态)语言,有类型推断,Objective-C...2)Swift派发机制总结: Swift中所有ValueType(值类型:Struct、Enum)使用直接派发; Swift中协议的Extensions使用直

    Java枚举的七种常见用法总结(必看)

    下面小编就为大家带来一篇Java枚举的七种常见用法总结(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Global site tag (gtag.js) - Google Analytics