C# enum枚举的用法(非常详细)
关键词 enum,可以翻译为列举,其实是英文 enumeration 的缩写,许多程序语言都有这个功能,如 Python、VBA、C 和 C++ 等。它的功能主要是使用有意义的名称来替换一组数字,这样可以让程序比较简洁,同时更易于阅读。
需留意的是列举 enum 元素间用“,”(逗号)隔开,最后一笔不需要逗号,如下所示:
假设使用英文字符串代表每个整数,整数从 0 开始,缺点是程序代码比较多,如果要定义代表星期信息的列举名称 WeekDays,可以用下列方式:
使用列举 enum,我们需要注意下列 3 点:
例如,输出列举的默认数值,同时验证是否如笔者所述,列举元素第 1 个字符串代表 0,第 2 个字符串代表 1,其他以此类推。
【实例】使用 for 循环,输出列举 enum 元素的默认值。
例如,定义季节 Season 的列举 enum,从 1 开始:
例如,输出自定义列举 Season 的 System.Enum 类型:
如果我们想要取得列举 Enum Season 内的元素,这时还需要使用 GetValues() 方法,此函数的语法如下:
再看一个例子,将元素名称和数值匹配起来:
上述 Red 代表 0,Green 代表 1,Blue 代表 30,Yellow 代表 31:
声明列举变量,然后将元素名称转换成数值或是将数值转换成元素名称:
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 点:
- 上述定义了从 Sunday 到 Saturday 的列举enum元素,这些元素就变成了常数,不可以对它们赋值,但是可以将它们的值赋给其他变量;
- 不可以定义与列举 enum 元素名称相同的变量;
- 要输出数字需使用 int,执行显式转换。
例如,输出列举的默认数值,同时验证是否如笔者所述,列举元素第 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
【实例】使用 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
如果我们想要取得列举 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