[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 类
出处:http://kyo-yo.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。