ZetCode

C# 枚举

最后修改于 2023 年 7 月 5 日

C# 枚举教程展示了如何在 C# 语言中使用枚举类型。

枚举类型(也称为枚举或 enum)是一种数据类型,由一组命名的值组成。 声明为具有枚举类型的变量可以被分配任何枚举器作为值。 枚举使代码更具可读性。

我们使用 enum 关键字定义枚举类型。

enum Difficulty
{
    Easy,
    Normal,
    Hard,
    VeryHard
}

默认情况下,枚举成员的关联常量值为 int 类型。 它们从零开始,并按照定义文本的顺序递增一。 可以定义其他类型,包括 bytesbyteshortushortuintlongulong

枚举是值类型;它们在堆栈上创建,而不是在堆上创建。

C# 枚举简单示例

以下是使用 enum 类型的简单示例。

Program.cs
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 成员提供自己的值。

Program.cs
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 类型的工作原理。

Program.cs
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# 枚举成员的不同类型

在下一个示例中,我们更改枚举成员的数据类型。

Program.cs
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# 枚举转换

可以在枚举类型及其底层整数类型之间进行显式转换。

Program.cs
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 的幂。)

这样,枚举可以表示选择的组合。 我们可以使用按位逻辑运算符 |& 来组合选择或相交选择的组合。

Program.cs
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 方法检查指定的枚举中是否存在给定的整数值,或者其作为字符串的名称。

Program.cs
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# 中的枚举。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程