C# Enum(枚举)示例

⚡ 智能摘要

C# 中的枚举定义了一组命名的常量整数值,例如星期几,这使得代码更易于阅读和维护。`enum` 关键字声明这些固定的常量一次,即可在整个程序中重复使用。

  • 📐 定义: enum 关键字将相关的命名常量分组到一个类型下,用易读的标识符替换分散的魔法数字。
  • 🗓️ 天数示例: 一个名为 Days 的枚举存储了星期几,Days.Sun 按名称返回选定的成员。
  • 🔢 潜在价值观: 枚举成员映射到从零开始递增的整数值,除非指定自定义数字,否则每次递增 1。
  • 🔁 转换: 显式类型转换将枚举转换为其整数,而 Enum.Parse 和 Enum.TryParse 将文本转换回成员。
  • 🚩 标志: Flags 属性允许枚举使用按位或运算符将多个选项组合成位域。
  • 🤖 人工智能辅助: GitHub Copilot 和 ML.NET 可以帮助生成枚举定义并将枚举映射到机器学习特征。

C# 枚举(Enumeration)

C# 枚举

枚举在任何编程语言中都用于定义一组常量值。例如,可以将一周中的各天定义为枚举,并在程序中的任何地方使用。在 C# 中,枚举是借助关键字“enum”定义的。

让我们看一个例子来了解如何使用“enum”关键字。

在我们的示例中,我们将定义一个名为 days 的枚举,用于存储一周中的天数。对于每个示例,我们将仅修改 Program.cs 文件中的 main 函数。

C# 枚举

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Program 
 {
  enum Days{Sun,Mon,tue,Wed,thu,Fri,Sat};
  
  static void Main(string[] args) 
  {
   Console.Write(Days.Sun);
   
   Console.ReadKey();
  }
 }
}

Code 解释:-

  1. 枚举 数据类型 指定用于声明一个枚举。枚举的名称为 Days。一周中的所有天数都被指定为枚举的值。
  2. 最后,console.write 函数用于显示枚举的值之一。

如果上述代码输入正确,并且程序成功执行,则会显示以下输出。

输出:

C# 枚举

从输出中,您可以看到枚举的“Sun”值显示在控制台中。

为什么要在 C# 中使用枚举?

枚举类型使程序更易读、更安全、更易于维护。枚举类型不会像传统做法那样在代码中散布毫无意义的数字(有时被称为“魔法数字”),而是为每个值赋予一个描述性的名称,明确其含义。

  • 可读性: 像 Days.Fri 这样的名称比数字 5 要清晰得多,因此任何阅读代码的人都能立即理解其含义。
  • 型式安全: 使用枚举类型声明的变量只能存储已定义成员中的一个,这可以防止无效值混入。ping 英寸
  • 可维护性: 相关常量位于同一位置,因此添加或重命名值会相应地更新整个程序。
  • 数据绑定: WPF 和 ASP.NET 等框架可以将枚举绑定到下拉列表,这使得枚举在构建用户界面时非常有用。

由于编译器会检查每个赋值是否在允许的成员范围内,枚举还可以帮助在程序运行之前及早发现错误。

为 C# 枚举赋值自定义值

默认情况下,C# 会将枚举类型的第一个成员赋值为 0,并将后续每个成员的值递增 1。在上面的 Days 枚举中,Sun 等于 0,Mon 等于 1,Sat 等于 6。您可以通过指定显式数值来覆盖这些默认值。

  • 显式值: 写入枚举 Level {Low = 1, Medium = 5, High = 10} 将每个成员设置为选定的数字,而不是默认序列。
  • 部分作业: 如果只给部分成员赋值,编译器会从最后一个赋值开始对后续成员进行编号。
  • 底层类型: 枚举类型默认以 int 类型存储成员,但你可以将其基于 byte、short 或 long 类型来节省内存或扩展范围。

当数字必须与外部系统(例如数据库代码或协议常量)匹配时,自定义值非常有用,这样枚举就能准确地反映真实数据。

如何将 C# 枚举转换为 int、string 和 flags 类型

C# 经常需要将枚举值转换为另一种形式,例如将其存储为数字或从文本中读取。这些转换有几种标准方法。

  • 枚举类型转整数类型: 显式强制转换(例如 (int)Days.Wed)返回底层整数,这对于存储或算术运算很有用。
  • 整数转枚举: 反过来,例如 (Days)3,会将数字转换回匹配的枚举成员。
  • 字符串转枚举: Enum.Parse 和更安全的 Enum.TryParse 可以将“Fri”之类的名称转换为 Days.Fri 成员,而不会因无效文本而抛出异常。
  • 枚举类型转字符串: 对任何成员调用 ToString() 都会返回其名称,因此 Days.Sun.ToString() 会生成“Sun”用于显示或记录。
  • 会员名单: Enum.GetValues 和 Enum.GetNames 返回每个值或名称,这有助于填充菜单或验证输入。

当枚举应该表示多个选项的组合而不是单个选项时,应用 Flags 属性,并为每个成员赋予 2 的幂,例如 1、2、4 和 8。然后,您可以使用按位或运算符组合成员,并使用 HasFlag 方法测试特定选项。

这些转换技术使得枚举类型能够在易读名称、存储数字和组合标志集之间清晰地转换,保持ping 程序的其余部分既符合规范又易于理解。

常见问题

枚举变量的默认值为 0,该值映射到等于 0 的成员。如果没有成员为 0,则该变量仍然保存为 0,因此开发人员通常会先定义一个 None 或 Unknown 成员,以避免混淆。

常量定义了一个命名值,而枚举则将一组相关的命名常量归为同一类型。枚举还增加了类型安全性,因为一个变量只能存储枚举中已定义成员之一。

是的。枚举可以在命名空间内声明,也可以嵌套在类或结构体中,这样它的作用域就仅限于该类型。但是,C# 不允许在方法体内部声明枚举。

是的。两个或多个成员可能共享同一个底层编号,使得后面的名称成为第一个成员的别名。比较操作会将它们视为相等,并将该值转换为字符串会返回枚举中第一个定义的名称。

枚举是一种值类型,因此它直接存储数据,而不是像其他类型那样将数据作为引用存储在堆上。它继承自 System.Enum,但其底层行为类似于整型,这使得复制和比较枚举值的速度非常快。

是的。在 ML.NET 中,您可以将枚举映射到类别特征或标签,通常是通过将其转换为整数值或独热编码来实现。强类型枚举可以保持机器学习管道的输入列清晰一致。

是的。GitHub Copilot 建议在 Visual Studio 中定义完整的枚举类型、自定义值、标志属性以及诸如 Enum.TryParse 之类的转换辅助方法。 VS Code. Rev请仔细查看每个建议,因为 Copilot 可能会选择与您的域名不符的值或名称。

使用 `Enum.IsDefined` 方法,当给定的数字或名称与已定义成员匹配时,该方法返回 true。将其与 `Enum.TryParse` 结合使用,可以在将文本转换为枚举值之前安全地验证用户输入。

总结一下这篇文章: