首页 / C#开发 / 正文

了解C#/.NET中的枚举--什么是枚举?为什么使用枚举?

6184 发布于: 2015-08-27 读完约需11分钟

枚举:为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。

例如,假设您必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举。

枚举是使用 enum 关键字声明的。我们以定义性别作为枚举例子,如下:

登录后复制
enum Gender { Male, Female }

以上就是声明一个枚举的例子,非常的简单是不?

但有几点需要特别注意的:
1.请使用enum关键字来声明一个枚举。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。
枚举本身的修饰符仅能使用public和internal;

2.枚举类型的枚举成员均为静态,且默认为Int32类型,上例中使用到了赋值。

3.枚举是值类型,隐式继承自System.Enum,不能手动修改。System.Enum本身是引用类型,继承自System.ValueType。

4.枚举都是隐式密封的,不允许作为基类派生子类。

5.每个枚举成员均具有相关联的常数值。此值的类型就是枚举的底层数据类型。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内。如果没有明确指定底层数据类型则默认的数据类型是int类型。

6.枚举成员不能相同,但枚举的值可以相同。

7.枚举最后一个成员的逗号和大括号后面的分号可以省略枚举使用的实例,代码如下:

登录后复制
using System; namespace EnumDemo { class Program { static void Main(string[] args) { //声明一个枚举变量 Gender man = Gender.Male; //测试之前我们声明的枚举变量的值 if (man == Gender.Male) { Console.WriteLine("Male"); } if (man == Gender.Female) { Console.WriteLine("Female"); } Console.ReadKey(); } } /// <summary> /// 定义Gender的枚举类型 /// </summary> enum Gender { Male, Female } }

输出结果:Male

在了解了什么是枚举之后,我们再来分析为什么在C#中使用枚举?

1.枚举类型的键在Visual Studio中是可以智能提示的,如图:

enum-1

2.枚举能够使代码更加清晰,更易维护

使用ToString()获取枚举的键,代码如下:

登录后复制
//使用ToString()获取枚举的键 Console.WriteLine(Gender.Female.ToString());//输出:Female

使用强类型转换获取枚举的值,代码如下:

登录后复制
//使用强类型转换获取枚举的值 Console.WriteLine((int)Gender.Female);//输出:1

注意:枚举类型默认的是Int类型,枚举中第一个键的默认对应值(如果在未指定值的情况下)为:0

我们也可以指定枚举的值,如:

登录后复制
/// <summary> /// 定义Gender的枚举类型 /// </summary> internal enum Gender { Male=1, Female=2 }

那么,我们再获取本例中枚举数值的时候,得到的就不是1,而是2了:

登录后复制
//使用强类型转换获取枚举的值 Console.WriteLine((int)Gender.Female);//输出:2

同时,我们也可以指定枚举的数据类型,如:

登录后复制
/// <summary> /// 定义Gender的枚举类型 /// </summary> enum Gender : byte { Male , Female }

我们再查看Gender枚举此时的基础类型:

登录后复制
//查看Gender枚举此时的基础类型 Type type = Enum.GetUnderlyingType(typeof(Gender)); Console.WriteLine(type);//输出System.Byte

关于枚举的键值相互获取的问题,请参见文章《NET(C#)枚举的使用总结–获取键/值及键/值列表等》枚举在switch语句中同样有可用:

登录后复制
//声明一个枚举变量 Gender man = Gender.Male; switch (man) { case Gender.Male: Console.WriteLine("Male"); break; case Gender.Female: Console.WriteLine("Female"); break; default: throw new ArgumentOutOfRangeException(); }

输出:Male

枚举类型作为位标志可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。

(当然,某些组合在您的程序代码中可能没有意义或不允许使用。)创建位标志枚举的方法是应用 System.FlagsAttribute 属性并适当定义一些值,以便可以对这些值执行 AND、OR、NOT 和 XOR 按位运算。

在位标志枚举中包含一个值为零(表示“未设置任何标志”)的命名常量。如果零值不表示“未设置任何标志”,则请不要为标志指定零值。

在下面的示例中,定义了 Days 枚举的另一个版本,即 Days2。Days2 具有 Flags 属性,且它的每个值都是 2 的若干次幂,指数依次递增。这样您就可以创建值为 Days2.Tuesday 和 Days2.Thursday 的 Days2 变量。

登录后复制
[Flags] enum Days2 { None = 0x0, Sunday = 0x1, Monday = 0x2, Tuesday = 0x4, Wednesday = 0x8, Thursday = 0x10, Friday = 0x20, Saturday = 0x40 } class MyClass { Days2 meetingDays = Days2.Tuesday | Days2.Thursday; }

若要在某个枚举上设置标志,请使用逻辑 OR 运算符,如下面的示例所示:

登录后复制
//使用位运算OR初始化两个标识 meetingDays = Days2.Tuesday | Days2.Thursday; // 使用位运算OR添加一个新的标识Days2.Friday meetingDays = meetingDays | Days2.Friday; Console.WriteLine("Meeting days are {0}", meetingDays); //输出: Meeting days are Tuesday, Thursday, Friday // 使用位运算XOR(^)移除一个标识 meetingDays = meetingDays ^ Days2.Tuesday; Console.WriteLine("Meeting days are {0}", meetingDays); //输出: Meeting days are Thursday, Friday

若要确定是否设置了特定标志,请使用逻辑 AND 运算,如下面的示例所示:

登录后复制
//使用位运算AND测试标识 bool test = (meetingDays & Days2.Thursday) == Days2.Thursday; Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not"); //输出: Thursday is a meeting day.

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: 一款轻量级的Bootstrap 3模态弹窗插件--bootstrap3-dialog

下一篇: 使用jQuery判断Bootstrap checkbox是否是选中状态

本文永久链接码友网 » 了解C#/.NET中的枚举--什么是枚举?为什么使用枚举?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册