[C#]C#补习——类型和操作符—PART3—枚举

       在补习完C#类以及一些语法上的知识后,再回到类型上进行补习,本章补习的是C#中的枚举。

以下是本文所要介绍的内容:

1、枚举中忽略的知识。

2、枚举常见的各种使用方法。

 

一、枚举中忽略的知识

    对于枚举,一般的用法都是用来解决一些代码的可读性,如下代码:

switch(state)
{
     case 0:
        break;
     case 1:
        break;
}
switch(stateEnum)
{
     case StateEnum.Opened:
         break;
     case StateEnum.Closed;
         break;
}

通过对比上面的代码,我们可以很容易的看出使用了枚举后代码的可读性更强了,而本文不是来介绍如何枚举的基础知识的,而是记录下我忽略过的一些知识,也可能是你所需要了解的

1、枚举中的值类型默认为int,当然也可以是short,long等数值类型,但是不能是char、string等类型。

如果想更改枚举的类型只需按照以下代码既可:

public enum StateEnum:long
{
}

2、枚举中的值默认从0开始,并且可以不用给枚举显示的指定值,如果不显示指定值则默认从0开始,每个枚举在前一个枚举的值上+1。

3、枚举是值类型但是其并不是直接继承值类型的基类型:System.ValueType,而是以下的继承链:

System.Object->System.ValueType->System.Enum->具体枚举

4、对于某个变量有3种或者3种以上的情况的时候应该使用枚举而不是使用int或者string,因为这样的代码可读性更强。

5、使用枚举不会带来什么性能问题,由于其本质还是值类型。

 

二、枚举常见的各种使用方法

     在日常开发的过程中,枚举可以帮我们解决很多问题,但是也会碰到许多问题,下面列举了一些枚举常见的使用方法:

1、可以将枚举的值指定为另一个枚举,且如果后续枚举没有指定值则会自动增加,如下代码:

public enum StateEnum
{
     Opened=0,
     Closed=1,
     Error=Closed,    
     UnKnow
}

可以看到上面的代码中,Error的值是使用的和Closed一样的值,而UnKnow并未指定值,这时根据枚举的特性,UnKnow的值则应该是2。

 

2、枚举数组之间的转换,如果有2个定义类似或者相同的枚举组成数组想进行转换,一般来说是不行的(C#不支持这样的转换),而可以通过先将枚举数组转成Array然后再转成相应的枚举数组,如下代码:

StateEnum1[] stateEnums=(StateEnum1[])(Array)new StateEnum2[3];

虽然这样做可以将C#不支持的形式变成可能,但是并不推荐这么做,因为这样可能会出现不可预见的错误。

而对于枚举的正常转换都是可以通过Enum.Parse()进行转换。

 

3、如果需要对枚举进行组合使用(如按位计算),则需要使用FlagAttributes特性,如下代码:

[Flags]  //属于System.IO命名空间下
public enum State
{
     Read=0,//000
     Write=1,//001
     Create=2,//010
     Delete=4,//100

Allow=Read | Write } public void Test(State state) { if(state==State.Read | State.Write) { } }


一旦使用了Flags特性后,就可以像上面的代码一样对枚举进行组合判断,但需要注意的是,使用了Flags特性后必须为枚举显式的指定值,否则无法使用,同时显式指定的值最好是2的次幂,如:0,1,2等,这样可以保证组合的值不会重叠,具体可以查看MSDN:FlagsAttribute 类

posted @ 2011-01-04 11:32  kyo-yo  阅读(1637)  评论(0编辑  收藏  举报