[C#]C#补习——类型和操作符—PART3—枚举
在补习完C#类以及一些语法上的知识后,再回到类型上进行补习,本章补习的是C#中的枚举。
以下是本文所要介绍的内容:
1、枚举中忽略的知识。
2、枚举常见的各种使用方法。
一、枚举中忽略的知识
对于枚举,一般的用法都是用来解决一些代码的可读性,如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | switch (state) { case 0: break ; case 1: break ; } switch (stateEnum) { case StateEnum.Opened: break ; case StateEnum.Closed; break ; } |
通过对比上面的代码,我们可以很容易的看出使用了枚举后代码的可读性更强了,而本文不是来介绍如何枚举的基础知识的,而是记录下我忽略过的一些知识,也可能是你所需要了解的:
1、枚举中的值类型默认为int,当然也可以是short,long等数值类型,但是不能是char、string等类型。
如果想更改枚举的类型只需按照以下代码既可:
123public
enum
StateEnum:
long
{
}
2、枚举中的值默认从0开始,并且可以不用给枚举显示的指定值,如果不显示指定值则默认从0开始,每个枚举在前一个枚举的值上+1。
3、枚举是值类型但是其并不是直接继承值类型的基类型:System.ValueType,而是以下的继承链:
System.Object->System.ValueType->System.Enum->具体枚举
4、对于某个变量有3种或者3种以上的情况的时候应该使用枚举而不是使用int或者string,因为这样的代码可读性更强。
5、使用枚举不会带来什么性能问题,由于其本质还是值类型。
二、枚举常见的各种使用方法
在日常开发的过程中,枚举可以帮我们解决很多问题,但是也会碰到许多问题,下面列举了一些枚举常见的使用方法:
1、可以将枚举的值指定为另一个枚举,且如果后续枚举没有指定值则会自动增加,如下代码:
1 2 3 4 5 6 7 | public enum StateEnum { Opened=0, Closed=1, Error=Closed, UnKnow } |
可以看到上面的代码中,Error的值是使用的和Closed一样的值,而UnKnow并未指定值,这时根据枚举的特性,UnKnow的值则应该是2。
2、枚举数组之间的转换,如果有2个定义类似或者相同的枚举组成数组想进行转换,一般来说是不行的(C#不支持这样的转换),而可以通过先将枚举数组转成Array然后再转成相应的枚举数组,如下代码:
1 | StateEnum1[] stateEnums=(StateEnum1[])(Array) new StateEnum2[3]; |
虽然这样做可以将C#不支持的形式变成可能,但是并不推荐这么做,因为这样可能会出现不可预见的错误。
而对于枚举的正常转换都是可以通过Enum.Parse()进行转换。
3、如果需要对枚举进行组合使用(如按位计算),则需要使用FlagAttributes特性,如下代码:
1 2 3 4 5 6 7 | [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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?