C# 枚举

2025年9月6日 | 阅读 9 分钟

在 C# 编程语言中,Enum 也被称为枚举。它用于存储一组命名的常量,例如季节、日期、月份、大小等。枚举常量也称为枚举数。C# 中的枚举可以使用 enum 关键字在类或结构内部或外部声明。它使我们能够创建相关符号名称的组,这些符号名称代表代码中的不同状态或选项。

枚举常量具有从 0 开始的默认值,每个数字递增 1。但是,如果需要,我们可以显式分配自定义值。

例如,我们可以创建一个名为 Seasons 的枚举,例如 Winter、Spring、Summer 和 Fall,而不是使用 0、1、2、3 等来表示季节。

枚举语法

它具有以下语法:

在这个语法中,

  • EnumName:它代表枚举的名称。

C# 枚举示例

让我们看一个例子来说明 C# 编程中的枚举。

示例

编译并运行

输出

WINTER = 0
SUMMER = 2

说明

在此示例中,我们声明了一个名为 Season 的枚举,其中包含四个值。在 Main 方法中,它将两个枚举成员(WINTER 和 SUMMER)转换为整数并输出它们各自的值。默认情况下,WINTER 为 0,SPRING 为 1,SUMMER 为 2,FALL 为 3,因此它打印 WINTER 的 0 和 SUMMER 的 2。

C# 枚举的特性

C# 枚举有几个重要的特性。其中一些如下:

  • 枚举可以使用 enum 关键字在类、命名空间或结构中声明。
  • 它用于定义一组命名的常量。
  • 同一枚举中的枚举成员应该是唯一的。
  • 它可以用于定义字符串的自定义整数。
  • 默认情况下,枚举的基类型是 int。
  • 它可以在 switch 语句中使用。
  • 枚举成员默认是 public、static 和 constant。

类内部的枚举

在 C# 编程中,枚举也可以定义在类内部。让我们看一个例子来说明类内部的枚举和更改索引。

示例

编译并运行

输出

WINTER = 10
SUMMER = 12

说明

在此示例中,我们声明了一个名为 Season 的枚举,其中 WINTER 为 10,因此后续成员会自动递增。在 main() 函数中,它将 WINTER 和 SUMMER 转换为整数并打印它们。输出将是 WINTER = 10 和 SUMMER = 12。

C# 枚举示例(在类内部声明)

让我们看一个在 C# 类中声明的星期的示例。

示例

编译并运行

输出

Sun = 0
Mon = 1
Sat = 6

说明

在此示例中,我们声明了一个名为 Days 的枚举,其中包含一周中的日期,默认值为 0。在 main() 函数中,它将 Sun、Mon 和 Sat 转换为它们的整数值并输出它们。输出将是:Sun = 0, Mon = 1, Sat = 6。

枚举方法和属性

C# 枚举有几个方法和属性。其中一些如下:

1) C# 中的 GetValues

在 C# 编程中,Enum.GetValues 用于检索定义在枚举类型中的所有值的数组。

C# 枚举示例:使用 getValues() 访问所有值

让我们看一个例子来说明 C# 枚举值,以使用 getValues() 函数访问所有值。

示例

编译并运行

输出

Sun
Mon
Tue
Wed
Thu
Fri
Sat

2) C# 中的 GetNames()

在 C# 编程中,Enum.GetNames() 方法用于检索定义在枚举类型中的所有名称的数组。

C# 枚举示例:使用 getNames() 遍历所有值

让我们看一个例子来说明 C# 枚举值,以使用 getValues() 函数遍历所有值。

示例

编译并运行

输出

Sun
Mon
Tue
Wed
Thu
Fri
Sat

说明

在此示例中,我们使用了从 Sun 到 Sat 的 Days 枚举。在 main() 函数中,它使用 Enum.GetNames() 检索所有枚举名称作为字符串,并使用 foreach 循环单独打印每个名称,显示一周中的所有日期。

3) C# 中的 IsDefined()

在 C# 编程中,此方法用于检查给定的值或名称是否存在于指定的枚举中。它返回布尔结果。

C# Enum.IsDefined() 示例

让我们看一个例子来说明 C# 中的 enum.IsDefined() 函数。

示例

编译并运行

输出

True
False

转换枚举

在 C# 编程中,枚举是类型化常量,但它们可以显式转换为其底层数字类型(如 int、byte 等)以及从这些类型转换回来。我们还可以将枚举转换为字符串,并将字符串解析为枚举值。当我们处理 UI、文件或数据库,需要显示或存储枚举名称或值时,这非常有用。

C# 转换枚举的示例

让我们看一个在 C# 中转换枚举的示例。

示例

编译并运行

输出

Integer value: 1
Enum value: Off
String value: On
Parsed enum: Off

说明

在此示例中,我们定义了一个值为 Off=0 和 On=1 的 Status 枚举。它将枚举成员转换为其整数值,将整数转换回枚举,使用 ToString() 函数将枚举转换为字符串,并使用 Enum.Parse() 函数将字符串解析为相应的枚举值。

Switch 语句中的枚举

在 C# 编程中,枚举与 switch 语句配合得非常好。在 switch 语句中使用枚举允许我们根据枚举值执行不同的操作。它有助于提高代码的可读性和可维护性,并且没有硬编码的字面量。

语法

它具有以下语法:

使用 Switch 语句的 C# 枚举示例

让我们看一个例子来说明 C# 中使用 switch 语句的枚举。

示例

编译并运行

输出

Midweek day

说明

在此示例中,我们声明了一个包含一周中日期的 Day 枚举。在 main() 函数中,它将 today 初始化为 Wed,并使用 switch 测试该值。它打印“Midweek day”,因为该值为 Day.Wed。

指定 C# 中的枚举类型

C# 中枚举的底层类型是 int,它将每个成员表示为 32 位有符号整数。我们还可以指定其他整数类型,如 byte、sbyte、short、ushort、uint、long 或 ulong,以管理内存消耗或适应外部数据格式。

语法

它具有以下语法:

指定 C# 枚举类型的示例

让我们看一个在 C# 中指定枚举类型的示例。

示例

编译并运行

输出

Temperature Level: Normal
Underlying Value: 0
Casted from number: Extreme

说明

在此示例中,我们定义了一个以 short 为底层类型的 TemperatureLevel 枚举,并为温度级别分配了特定的数值。在 main() 函数中,它将 Normal 分配给一个级别,并打印枚举的名称及其值。之后,它将数字 50 转换为枚举,这等同于 Extreme 的值,并打印出来。

[Flags] 属性用于位枚举

在 C# 中,在枚举上使用 [Flags] 属性允许您表示位字段的集合。它允许使用按位运算符组合枚举值,这对于存在许多可以同时激活的选择、权限或状态的情况非常有用。

用于位枚举的 [Flags] 属性的 C# 示例

让我们看一个例子来说明 C# 中位枚举的 flag 属性。

示例

编译并运行

输出

Assigned Rights: Read, Write
Has Write Permission: True
Updated Rights: Read, Write, Execute
After Removing Read: Write, Execute

说明

在此示例中,我们使用 [Flags] 属性声明了一个 A 枚举,以便可以使用按位运算“组合”多个值。在 main() 函数中,权限被分配为 Read | Write,输出为 Read, Write。它使用 HasFlag 查询 Write 是否存在。之后,添加了 execute,最终通过按位 AND 和 NOT 排除 read。最后,它查询是否还有剩余权限,并相应地打印。

结论

总之,C# 枚举提供了一种类型安全且美观的方式来表示固定数量的命名常量。它们提高了可读性,消除了硬编码值引起的错误,并且与 switch 等控制语句非常契合。通过底层类型、[Flags] 等属性应用以及扩展方法,枚举可以得到进一步的丰富,变得更加灵活和强大。

C# 枚举常见问题解答

1) C# 中的枚举是什么?

枚举是 C# 中的一种值类型,它定义了一组命名的常量。使用枚举可以提高代码的可读性,并简化与相关值集的工作。

2) C# 中枚举的默认底层类型是什么?

枚举的默认底层类型是 int。但是,我们可以显式使用其他整数类型,如 byte、short 或 long。

3) 我们可以为枚举成员分配特定值吗?

是的,我们可以为枚举成员分配自定义数值。当与需要特定值的外部系统或 API 交互时,此功能特别有用。

4) 枚举是否可以包含重复值?

是的,多个名称可以具有相同的值。但是,当从值返回到名称时,只返回第一个名称。

5) 枚举是引用类型还是值类型?

枚举是值类型,并且派生自 System.Enum。它们像所有其他值类型一样占用内存并具有赋值行为。


下一主题C# 属性