首页 > 编程笔记 > C#笔记 阅读:2

C# enum枚举的用法(非常详细)

关键词 enum,可以翻译为列举,其实是英文 enumeration 的缩写,许多程序语言都有这个功能,如 Python、VBA、C 和 C++ 等。它的功能主要是使用有意义的名称来替换一组数字,这样可以让程序比较简洁,同时更易于阅读。

C# enum枚举的定义和使用

列举 enum 的定义和结构体 struct 类似,如下所示:
存取修饰词 enum 列举名称
{
列举元素1,
...
列举元素n
}
注意,enum 的修饰词默认是 public,也只能设置为 public,一般都省略。

需留意的是列举 enum 元素间用“,”(逗号)隔开,最后一笔不需要逗号,如下所示:
enum 列举名称
{
    列举元素1, ..., 列举元素n
}
此外,也可以将上述定义的列举元素用一行表示,如下所示:
enum 列举名称
{
    列举元素1, ..., 列举元素n
}

假设使用英文字符串代表每个整数,整数从 0 开始,缺点是程序代码比较多,如果要定义代表星期信息的列举名称 WeekDays,可以用下列方式:
enum WeekDays
{
    Sunday,       // 0
    Monday,      // 1
    Tuesday,     // 2
    Wednesday,   // 3
    Thursday,    // 4
    Friday,      // 5
    Saturday    // 6
}
上述使用了简单的列举 enum WeekDays,方便易懂,就代替了需要个别定义星期字符串。

使用列举 enum,我们需要注意下列 3 点:
例如,输出列举的默认数值,同时验证是否如笔者所述,列举元素第 1 个字符串代表 0,第 2 个字符串代表 1,其他以此类推。
Console.WriteLine($"Sunday : {(int) WeekDays.Sunday}");
Console.WriteLine($"Monday : {(int) WeekDays.Monday}");
Console.WriteLine($"Tuesday : {(int) WeekDays.Tuesday}");
Console.WriteLine($"Wednesday : {(int) WeekDays.Wednesday}");
Console.WriteLine($"Thursday : {(int) WeekDays.Thursday}");
Console.WriteLine($"Friday : {(int) WeekDays.Friday}");
Console.WriteLine($"Saturday : {(int) WeekDays.Saturday}");
enum WeekDays
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}
执行结果为:

Sunday : 0
Monday : 1
Tuesday : 2
Wednesday : 3
Thursday : 4
Friday : 5
Saturday : 6

由于列举 enum 元素是连续的整数,所以也可以使用 for 循环输出列举 enum 元素的默认值。

【实例】使用 for 循环,输出列举 enum 元素的默认值。
for (WeekDays i = WeekDays.Sunday; i <= WeekDays.Saturday; i++)
{
    Console.WriteLine($"{i,-9} : {(int) i}");
}
enum WeekDays
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}
执行结果为:

Sunday    : 0
Monday    : 1
Tuesday   : 2
Wednesday : 3
Thursday  : 4
Friday    : 5
Saturday  : 6

C#定义列举enum元素的整数值

使用列举 enum 元素时,不需要一定从 0 开始,也可以从 1 开始。此外其他不需要一定是连续的,使用时可以重新定义列举 enum 元素的值。

1) 定义enum从元素1开始编号

下列语句定义列举 enum 元素从 1 开始编号:
enum Season
{
    Spring = 1, Summer, Autumn, Winter
}

例如,定义季节 Season 的列举 enum,从 1 开始:
Console.WriteLine("enum 从 1 开始");
for (Season i = Season.Spring; i <= Season.Winter; i++)
{
    Console.WriteLine($"{i} : {(int) i}");
}
enum Season
{
    Spring = 1, Summer, Autumn, Winter
}
执行结果为:

enum 从 1 开始
Spring : 1
Summer : 2
Autumn : 3
Winter : 4

2) 定义列举enum元素数值不连续

下列语句定义的列举 enum 元素数值不连续:
enum Season
{
    Spring = 10, Summer = 20, Autumn = 30, Winter = 40
}
我们可以使用 foreach 遍历上述列举内容,不过在讲解遍历上述列举内容前,笔者先讲解 typeof() 函数,这个函数可以获得 System.Enum 类型。

例如,输出自定义列举 Season 的 System.Enum 类型:
var memberType = typeof(Season);
Console.WriteLine(memberType.Name);  // 取得 System.Enum
Console.WriteLine(typeof(Season));    // 取得 System.Enum
enum Season
{
    Spring = 10, Summer = 20, Autumn = 30, Winter = 40
}
执行结果为:

Season
Season

上述程序第 3 行只是让读者了解可以从 Name 属性获得 System.Enum 的数据类型,其实当我们定义了列举 Enum Season 后,在 System.Enum 内就创建了 Season 数据类型。

如果我们想要取得列举 Enum Season 内的元素,这时还需要使用 GetValues() 方法,此函数的语法如下:
public static Array GetValues(Type enumType);
上述参数 enumType 是列举类型,此时可以放置 type(Season) 当作参数,这个方法可以使用 Enum 引用,细节可参考下列实例。
Console.WriteLine("输出列举元素名称");
foreach (Season i in Enum.GetValues(typeof(Season)))
{
    Console.WriteLine(i);
}

Console.WriteLine("输出列举元素值");
foreach (int i in Enum.GetValues(typeof(Season)))
{
    Console.WriteLine(i);
}

enum Season
{
    Spring = 10, Summer = 20, Autumn = 30, Winter = 40
}
执行结果为:
输出列举元素名称
Spring
Summer
Autumn
Winter
输出列举元素值
10
20
30
40
上述第 2 行,取得列举 Enum Season 的元素名称也可以使用 Enum 的 GetNames() 方法,此方法的语法如下:
public static Array GetNames(Type enumType);
使用 Enum 的 GetNames() 方法重新设计上面的程序:
var memberType = typeof(Season);
Console.WriteLine(memberType.Name);  // 取得 System.Enum
Console.WriteLine(typeof(Season));    // 取得 System.Enum
enum Season
{
    Spring = 10, Summer = 20, Autumn = 30, Winter = 40
}
执行结果与上例相同。

再看一个例子,将元素名称和数值匹配起来:
Console.WriteLine("输出列举元素名称和数值");
foreach (Season i in Enum.GetValues(typeof(Season)))
{
    Console.WriteLine($"{i} : {(int) i}");
}
enum Season
{
    Spring = 10, Summer = 20, Autumn = 30, Winter = 40
}
执行结果为:

输出列举元素名称和数值
Spring : 10
Summer : 20
Autumn : 30
Winter : 40

3) 不规则定义列举enum元素值

定义列举 enum 元素值也可以是不规则的,可以参考下列定义:
enum Color
{
    Red, Green, Blue = 30, Yellow
}

上述 Red 代表 0,Green 代表 1,Blue 代表 30,Yellow 代表 31:
Console.WriteLine("输出列举元素名称和数值");
foreach (Color i in Enum.GetValues(typeof(Color)))
{
    Console.WriteLine($"{i, -6} : {(int) i}");
}
enum Color
{
    Red, Green, Blue = 30, Yellow
}
执行结果为:

输出列举元素名称和数值
Red    : 0
Green  : 1
Blue   : 30
Yellow : 31

C#列举的转换

前面已经说明过 enum 元素名称转换成数值,也可以将数值转换成元素名称,下列将用一个更完整的实例进行解说。

声明列举变量,然后将元素名称转换成数值或是将数值转换成元素名称:
Season x = Season.Summer;
Console.WriteLine($"整数 {x} 元素名称是 {(int) x}");

var y = (Season) 2;
Console.WriteLine(y);  // 输出 Autumn

var z = (Season) 5;  // 超出范围
Console.WriteLine(z);  // 输出原数值 5

enum Season
{
    Spring, Summer, Autumn, Winter
}
执行结果为:

整数 Summer 元素名称是 1
Autumn
5

相关文章