首页 技术 正文
技术 2022年11月6日
0 收藏 458 点赞 819 浏览 1325 个字

实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型。

关于枚举类型

枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护。

枚举类型是值类型,然而有别于其它值类型,枚举类型不能定义任何方法。除非用扩展方法。

然而正如我之前说到的,也许当你想用扩展方法的时候可以先考虑一下这个地方是否还适合用枚举类型,又或者这个方法是否适合加在这个枚举类型中。

在编译枚举类型时,C#编译器已经将每个符号转换成了类型的一个常量字段。

C#默认容纳一个枚举类型的值的基础类型为int,而实际上也可以像下面一样自定义:

 enum 英雄类型:byte {
力量英雄,
敏捷英雄,
智力英雄
}

可以用System.Enum.GetUnderlyingType方法去获取枚举类型的值的基础类型。然而这里只能用一些基元类型,不能用FCL类型。

通常用的时候除了比较,也只有转换为字符串来查看具体的选项(其它的格式化的输出枚举感觉真心用不到的样子,所以这里不列举了):

英雄类型 heroType = 英雄类型.力量英雄;
Console.WriteLine(heroType.ToString());//力量英雄

也可以用Enum的静态方法GetValues返回一个数组,里面是Enum的所有选项。

也可以用Enum的静态方法IsDefined方法去查看枚举类型中,一个值或者其常量值是否被定义了。(然而这很慢,因为里面用了反射)

关于位标志

前面讲到可以将位标志当做一个特殊的枚举类型。

[ComVisible(true)]
[Flags]
public enum FileAttributes
{
ReadOnly = ,
Hidden = ,
System = ,
Directory = ,
Archive = ,
Device = ,
Normal = ,
Temporary = ,
SparseFile = ,
ReparsePoint = ,
Compressed = ,
Offline = ,
NotContentIndexed = ,
Encrypted = ,
IntegrityStream = ,
NoScrubData =
}

以上类型中,1的二进制为1,2的二进制为10,4的二进制为100。

也就是说可以用每个二进制位来确认唯一性,这就是位标志的原理。

var tmp = FileAttributes.ReadOnly | FileAttributes.Hidden;//表示只读且文件隐藏
if ((tmp & FileAttributes.ReadOnly) != ) {//因为二进制1&1才为1,所以只要存在最后的数值一定不为1
Console.WriteLine("tmp 只读");
}

查看上面的FileAttributes的定义,会发现有一个[Flags]特性,这个特性的作用就是当tmp.ToString()是”ReadOnly, Hidden”这个字符串。

如果没有[Flags]特性,就会为具体的数值。

上面讲得都是将枚举类型和位标志转换为字符串或者值,将字符串和值转成枚举类型或位标志可以用下面的方法:

Enum.TryParse<FileAttributes>("ReadOnly, Hidden", false, out tmp);//false为忽略大小写,这里为位标志,转枚举类型也差不多
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,084
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,559
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,408
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,181
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,818
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,901