撰写了文章 发布于 2020-03-24 16:41:30
从C#开始的编程入门——枚举类型
尽管银河系有多少颗星星我们数不出来具体多少,但是太阳系中的八大行星是哪几个在你我有生之年应该不会变了。
我们在讲switch结构时提到了用数字来表示星期几。
这似乎很自然,星期几和七个数字对应,我们想到用int变量去保存一个星期几。但实际上,这存在很多问题。
int的取值范围对于星期来说可以说是无限大,而星期几只存在七个固定的有效值。如果我们需要传递一个星期几作为方法参数,那么我们会遇到更多问题。
首先,由于是int类型,我们无法保证传递进来的参数是1-7。我们需要额外的代码去判断,这个时候我们还需要考虑是直接引发异常还是返回一个什么值。
其次,数字说到底是数字,我们如果并不是需要对应星期几的数字,我们可能还需要额外的代码去转换处理。
实际上,面对这种取值有限、值(基本)固定、值相互不重复的数据类型,我们应该考虑定义枚举类型。
定义
枚举类型实际上是一种带名称的常量集合。要定义枚举类型,使用enum关键字并给出枚举类型的名称。随后的大括号中是该枚举类型所有的可能的取值。比如我们定义表示星期的枚举类型:
enum Days
{
Monday,
Tuesday,
Wednsday,
Thursday,
Friday,
Saturday,
Sunday
}
定义变量和访问值
枚举类型也是类型,声明一个枚举类型变量和其他类型没什么区别。通过成员访问运算符选择枚举类型的值。
var today = Days.Monday;
通过枚举类型,我们限定了取值范围,像这样我们就不再需要害怕传递进来我们期望的值以外的值了。
同时,枚举类型也可以结合switch使用,你的编辑器甚至会为你自动生成对应枚举类型中所有情况的代码。
枚举类型的基础类型
尽管我们使用枚举类型限定了变量的取值范围,但是我们可能不只是需要区分不同的取值,我们可能需要获得某个真正的值进行其他操作,而不只是一个名字。
实际上每个枚举类型的成员都对应着一个具体的值,默认情况下是一个int类型的值。默认情况下,这个类型隐式地被设置成了int。如果你把鼠标指针放到枚举类型的成员上,你的IDE或者编辑器会提示第一个成员的值为0,后面依次递增。
手动设置枚举成员的值
如果你需要一个和成员对应的值,但是默认行为不满足你的需要,那么你可以手动设置。比如星期毕竟是从1开始的,那么:
enum Days
{
Monday = 1,
Tuesday, // = 2
Thursday, // = 3
// ……
从最后一个你手动设置的值开始,后面也会自动增加。
但是并不是所有情况下对应的值都是逐个枚举的,比如HTTP响应的状态码,状态码的代码是纯数字,可以用数值类型表示,但是它们不均匀、不连续地分布在1xx-5xx之间。这样我们可以手动设置其值。
enum HttpResponseCode
{
Ok = 200,
NotFound = 404,
NoContent = 204,
InternalServerError = 500
}
设置其他基础类型
如果默认的int不能满足需要,还可以手动设置基础类型为其他类型:
enum Foo : long {Bar}
但是只能为byte, sbyte, short, ushort, int, uint, long, ulong。
枚举类型的转换
由于枚举类型成员有对应的值,因此在需要时可以显式将枚举类型值转换为对应的基础类型。
var today = (int)Days.Monday;
枚举类型是值类型
枚举类型是值类型。和我们学过的结构一样,枚举类型的变量并不是一个引用。
var a = Days.Friday;
var b = a;
b = Days.Monday;
System.Console.WriteLine(a);
输出枚举类型
枚举类型也可以使用WriteLine输出,将会输出对应枚举成员的名称。
System.Console.WriteLine(Days.Friday);
目录