C# 枚举
最后修改于 2023 年 7 月 5 日
C# 枚举教程展示了如何在 C# 语言中使用枚举类型。
枚举类型(也称为枚举或 enum)是一种数据类型,由一组命名的值组成。 声明为具有枚举类型的变量可以被分配任何枚举器作为值。 枚举使代码更具可读性。
我们使用 enum 关键字定义枚举类型。
enum Difficulty
{
Easy,
Normal,
Hard,
VeryHard
}
默认情况下,枚举成员的关联常量值为 int 类型。 它们从零开始,并按照定义文本的顺序递增一。 可以定义其他类型,包括 byte、sbyte、short、ushort、uint、long 和 ulong。
枚举是值类型;它们在堆栈上创建,而不是在堆上创建。
C# 枚举简单示例
以下是使用 enum 类型的简单示例。
Day day = Day.Monday;
if (day == Day.Monday)
{
Console.WriteLine("It is Monday");
}
Console.WriteLine(day);
foreach (int i in Enum.GetValues(typeof(Day)))
{
Console.WriteLine(i);
}
enum Day
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
我们创建一个用于表示一周中各天的枚举。
enum Day
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
枚举使用 enum 关键字创建。 Monday, Tuesday, ... 这些裸字实际上存储的是数字 0..6。
Day day = Day.Monday;
我们有一个名为 day 的变量,它的枚举类型为 Day。 它被初始化为 Monday。
if (day == Day.Monday)
{
Console.WriteLine("It is Monday");
}
这段代码比将 day 变量与某个数字进行比较更具可读性。
Console.WriteLine(day);
此行将 Monday 打印到控制台。
foreach (int i in Enum.GetValues(typeof(Day)))
{
Console.WriteLine(i);
}
此循环将 0..6 打印到控制台。 我们获取 enum 值的底层类型。 对于计算机来说,enum 只是一个数字。 typeof 是一个运算符,用于获取类型的 System.Type 对象。 GetValues 方法需要它。 此方法返回指定枚举的值数组。 foreach 关键字遍历数组,逐个元素并将它们打印到终端。
$ dotnet run It is Monday Monday 0 1 2 3 4 5 6
我们可以为 enum 成员提供自己的值。
foreach (int i in Enum.GetValues(typeof(Day)))
{
Console.WriteLine(i);
}
enum Day
{
Monday = 10,
Tuesday = 11,
Wednesday = 12,
Thursday = 13,
Friday = 14,
Saturday = 15,
Sunday = 16
}
在该示例中,我们为 Day 枚举的成员提供值 10 到 16。
$ dotnet run 10 11 12 13 14 15
以下示例不应使用;它仅阐明 enum 类型的工作原理。
foreach (int i in Enum.GetValues(typeof(Days)))
{
Console.WriteLine(i);
}
enum Days
{
Monday,
Tuesday,
Wednesday = 8,
Thursday,
Friday,
Saturday,
Sunday
}
我们从 enum 成员的默认值开始,然后我们将 Wednesday 成员设置为 8。 下一个成员 Thursday 设置为 9,依此类推。
$ dotnet run 0 1 8 9 10 11 12
C# 枚举成员的不同类型
在下一个示例中,我们更改枚举成员的数据类型。
Season s1 = Season.Spring;
Season s2 = Season.Autumn;
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine("----------------------");
Console.WriteLine(s1.GetType());
Console.WriteLine(Enum.GetUnderlyingType(s1.GetType()));
enum Season : byte
{
Spring = 1,
Summer = 2,
Autumn = 3,
Winter = 4
}
我们有 Season 枚举。 成员值设置为 byte 类型。
$ dotnet run Spring Autumn ---------------------- Season System.Byte
C# 枚举转换
可以在枚举类型及其底层整数类型之间进行显式转换。
var p1 = Priority.Minor;
Console.WriteLine($"Integral value of {p1} is {(int) p1}");
var p2 = (Priority) 1;
Console.WriteLine(p2);
var p3 = (Priority) 2;
Console.WriteLine(p3);
enum Priority
{
Minor,
Major,
Critical
}
该示例中有三个显式转换。
Console.WriteLine($"Integral value of {p1} is {(int) p1}");
在此代码行中,我们使用 (int) 强制转换将 p1 成员类型转换为其类型。
var p2 = (Priority) 1; Console.WriteLine(p2);
在这里,我们将整数值转换为成员类型。
$ dotnet run Integral value of Minor is 0 Major Critical
C# 枚举标志
使用 Flags 属性,我们可以将枚举转换为位字段。 然后它可以被用作一组标志。(这些枚举成员的关联值应该是 2 的幂。)
这样,枚举可以表示选择的组合。 我们可以使用按位逻辑运算符 | 或 & 来组合选择或相交选择的组合。
var readWrite = Permissions.Read | Permissions.Write;
Console.WriteLine(readWrite);
[Flags]
enum Permissions
{
Execute = 0b_0000_0001,
Write = 0b_0000_0010,
Read = 0b_0000_0100
}
在该示例中,我们使用 | 运算符定义读写权限。
$ dotnet run Write, Read
C# Enum.IsDefined
Enum.IsDefined 方法检查指定的枚举中是否存在给定的整数值,或者其作为字符串的名称。
Console.WriteLine(Enum.IsDefined(typeof(Priority), 0));
Console.WriteLine(Enum.IsDefined(typeof(Priority), 4));
Console.WriteLine("-------------");
Console.WriteLine(Enum.IsDefined(typeof(Priority), "Critical"));
Console.WriteLine(Enum.IsDefined(typeof(Priority), "Medium"));
Console.WriteLine("-------------");
Console.WriteLine(Enum.IsDefined(typeof(Priority), Priority.Major));
Console.WriteLine(Enum.IsDefined(typeof(Priority), Priority.Minor | Priority.Critical));
[Flags]
enum Priority
{
Minor = 1,
Major = 2,
Critical = 4
}
在该示例中,我们使用 Enum.IsDefined 方法来检查某些值是否存在于 Priority 枚举中。
$ dotnet run False True ------------- True False ------------- True False
来源
在本文中,我们使用了 C# 中的枚举。
作者
列出所有 C# 教程。