.net 枚举(Enum)使用总结

在 实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,性别只有男跟女等等。如果把这些量说明为整型、字符 型或其它类型显然是不妥当的。为此,C#提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值 不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。

1、定义枚举

定义枚举很简单,直接使用enum关键字声明即可,例如定义性别的枚举,性别只有男和女

 public enum Sex
        {
            女 = 0,//’0‘是’女‘对应的内部表示,也可以说是女的Value,’女‘是外部表示,也可以说是Name
            男 = 1,
        }

2.使用枚举

如下所示:

  public void UseEnum()
        {
            //获取枚举对应的值
             int enumValue = (int)Sex.男;//enumValue的值则为  1

            //获取枚举的名称
             string enumText = Sex.男.ToString();//enumText的值则为 男

            //将int类型值转换为对应的枚举
             int intValue = 1;//int值
             Sex sex = (Sex)intValue;//sex则为对应男的枚举

            //将名称转换为对应的枚举
             string strValue = "男";
            sex = (Sex)Enum.Parse(typeof(Sex), strValue);//sex则为对应男的枚举

            //判断int值或名称是否在枚举定义项类
             if (Enum.IsDefined(typeof(Sex), intValue))//第二个参数也可以传入strValue
             {
                //有
             }

            //switch来判断sex (小技巧:先输入switch 再加两个Tab键  ,然后再switch()
            //里面输入枚举,再回车键,代码段就会自动的将枚举所有项加上case)
             switch (sex)
            {
                case Sex.女:
                    break;
                case Sex.男:
                    break;
                default:
                    break;
            }
            //........................
         }

3. 通常我们在数据库中,很多的一些状态、类型、性别等等字段保存的是数字,但我们在开发时需要判断这些状态时,直接使用 if(UserInfo.Sex==0)这种方式来判断,显然不太好,如果状态多时,自己都难分辨哪个数字代表什么状态。并且代码也不可观,我们在写代码 时应该尽量少写硬代码。如果使用枚举定义,数据库存储的枚举对应的值,而在写代码时使用枚举的名称,这样一看代码就知道数据库储值的是什么状态。非常清楚 明了。

4.UI层显示枚举的名称。如果数据库存储的是枚举的值(为数字),而在UI上当然不能已数字的方式显示,应该显示对应的枚举名称。例如在一个用户信息列表中需要绑定用户性别(枚举为上述的Sex),那该如何显示枚举的名称呢?一下提供多种方式

  3.1:GridView控件绑定数据源为例,可以添加一列模板项,通过值获取枚举名称

 <asp:TemplateField HeaderText="性别">
    <ItemTemplate>
         <%#(枚举所在命名空间.Sex)Convert.ToInt32(Eval("Sex"))%>
    </ItemTemplate>
</asp:TemplateField>

 3.2: 通过Enum对象获取名称

<asp:TemplateField HeaderText="性别">
      <ItemTemplate>
          <%#Enum.GetName(typeof(枚举所在命名空间.Sex), Convert.ToInt32(Eval("Sex")))%>
      </ItemTemplate>
  </asp:TemplateField>

还有很多方式来处理这个问题,大家可以自由选择。

5.枚举的‘高级用法’组合运用:例如一个界面里有:增、删、查、改等操作,但对应不同用户就有不同操作权限。例如A用户只能增、删,而B用户只能查、改等等。如果在权限表中某一个字段类型指定用户的操作权限时,问题就出来了。来看看一下3种解决方式:

  1.每个操作权限一条数据,缺点:每次更改权限时,避免不了删除和新增,并且数据量庞大,如果一个用户有一千权限就代表有一千条数据,那这张表的数据就不敢想象了。

  2.一个字段存储所有的操作权限,每个操作权限使用 某个指定的符号作为分隔符,这种方式叫简单、方便。

  3.就是使用我们的枚举组合,在一个字段存储所有的操作权限,但值只为一个数,不像方式2使用分隔符分开。

当然,还有很多方式可以解决这种问题。我们现在就来看看如何使用枚举组合来代表多个操作权限。

  5.1:定义一个操作权限枚举

 [Flags]//必须打上一个标记,打上这个标记系统才能识别这个枚举可使用组合方式
        public enum Role
        {
        未分配=0,
            删除数据 = 1,
            修改数据 = 2,
            新增数据 = 4,
            查看数据 = 8,
        }

 5.2:如果用户有删除、修改的权限在枚举定义中只有1和2的枚举,那怎么将这两个枚举值组合成一个枚举值存储到数据库呢?很简单,看一下代码:

int allRole = ((int)Role.删除数据) + ((int)Role.修改数据);
//这时allRole的值为3 (两个枚举对应值相加:1+2=3),这时直接将allRole值存储到数据就可以了

现在我们就来判断用户是否具有某个操作权限,先从数据库中取出权限值,以上述,allRole则为数据库中取出的值,为3,接下来我们通过位算符来判断:

代码

  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代表什么?了,更何况日后他人的维护呢。

时间: 2024-10-20 22:36:52

.net 枚举(Enum)使用总结的相关文章

poj1753 Flip Game(枚举Enum+dfs)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1753 Description Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 squares. One side of each piece is white and the o

c# 枚举enum

1 定义枚举 enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; 默认情况下,枚举中的每个元素的基础类型的值是int,如果不指定值,则其值以1递增;Days.Sunday 的值为 0,Days.Monday 的值为 1,依此类推. public enum TimeOfDay { Moning=0; AfterNoon=1; Evening=2; } 使用枚举: public string ge

poj2965 The Pilots Brothers&#39; refrigerator(直接计算或枚举Enum+dfs)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=2965 Description The game "The Pilots Brothers: following the stripy elephant" has a quest where a player needs to open a refrigerator. There are 16 handles

C++和Java中枚举enum的用法

在C++和java中都有枚举enum这个关键字,但是它们之间又不太一样.对于C++来说,枚举是一系列命名了的整型常量,而且从枚举值转化为对应的整型值是在内部进行的.而对于Java来说,枚举更像一个类的命名的实例,你可以自定义枚举的成员,枚举值转化为对应的整型值是再外部进行的.下面以我之前的一篇博客8.1 Implement Blackjack 实现21点纸牌来说明,里面有一个扑克牌花色的枚举类: // C++ defination enum Suit {Club, Diamond, Heart,

Java 语法 索引 ----- 枚举(Enum)

enum Speed { STOP, SLOW, NORMAL, FAST } Speed s = Speed.SLOW; switch(s) { case SLOW: break; } 参考文献: Java Quick Syntax Reference by Mikael Olsson Java 语法 索引 ----- 枚举(Enum)

Lua 与C/C++ 交互系列:动态注册枚举enum到Lua Code中,在运行时在Lua Code中获取内省信息

在Lua 5.1 Reference Manual  对于Lua 值和类型的介绍.Lua是一个动态语言,在Lua中变量仅仅有值而没有类型.所以在Lua中的变量不需要声明.所以的值本身包含类型. 其实Lua 包含一种运行时类型识别,通过type()函数,可以在运行时获取值的类型. 信息来自: Lua 5.1 Reference Manual  Values and Types Lua is a dynamically typed language. This means that variable

mysql数据类型——枚举enum(‘F’,&#39;M&#39;)

ENUM(“value1”,“value2”,...) 说明:枚举,列值可赋予值列表中的某个成员 允许的属性:除通用属性外无其他属性 缺省值:如果列可为NULL,则为NULL:如果列为NOTNULL,则为第一个枚举值 存储需求:对1到255个成员的枚举1个字节,对255到65535个成员的枚举2个字节 比较:不区分大小写(MySQL3.22.1版以前区分大小写) mysql数据类型--枚举enum('F','M')

枚举enum学习小记

参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社   1.枚举enum的用途浅例       写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生的成绩分A,B,C,D等,天气分sunny, cloudy, rainy等等.       更常见的,打开一个文件可能有三种状态:input, output和append.

聊一聊Java的枚举enum

一. 什么是枚举 枚举是一种数据类型,具有集合的一些特点,可以存放多个元素,但存储对象有限且固定,枚举也有比较常见的使用场景,如我们需要表达性别(男.女),颜色(红.黄.蓝),星期(星期一.星期二...星期日),四季(春.夏.秋.冬),地理位置(东.西.南.北),方向(前.后.左.右)等,这些场景都非常适合枚举. 二. 定义枚举 java中使用enum来定义枚举,和class,interface具有同样的等级,(注意是enum,而不是Enum),定义枚举可以有两种情况 第一种:默认构造器(空构造

枚举Enum 的常用方法

一.枚举介绍 通常定义常量方法和枚举定义常量方法区别 public class State { public static final int ON = 1; public static final Int OFF= 0; } 第一.它不是类型安全的. 你必须确保是int,其次,你还要确保它的范围是0和1. 第二.不够直观. 很多时候你打印出来的时候,你只看到 1 和0 ,但其没有看到代码的人并不知道你的企图. 抛弃你所有旧的public static final常量 枚举是一种规范它规范了参数