前言
在 .NET 框架中,主要包括值类型、引用类型等,在某些情况下,我们需要用可读性强的符号名称,代替硬编码的数值。从而提高代码可读性。在 C# 中,可以是使用枚举的值类型来实现,本文将了解枚举实现的几种示例。
枚举(Enum)
1、概述
枚举(enum)是.NET 提供的一种值类型,由一组可以命名常量定义整型数值类型的一种方法。由基础整数值类型的一组命名常量组成。枚举常用于多项选择的场景,如表示一周中的一天、订单状态(待支付、已支付、已完成)、用户状态(激活、冻结、已删除)等。
C# 使用关键字 enum 定义枚举成员的名称,语法如下面代码:
2、特点
增强可读性与可维护性:由于枚举允许对整型常量使用描述性名称,从而使用的代码更清晰、可读性也更强。
确保类型安全性:枚举可以在编译期间提供类型安全性,将值分配给该枚举类型的预定义常量集中的变量。
编译器对类型检查:编译器可对枚举值进行类型检查,确保仅使用有效的枚举常量。
支持智能感知:在使用集成开发环境时,可通过智能感知查看可用枚举值及其描述的列表。
与switch结合使用:枚举非常适合与 switch 语句一起使用,从而能够创建更简洁、更结构化的代码来处理多个情况。
降低错误风险:由于枚举常量在编译期间会得到验证,因此降低了因拼写错误或值不正确而导致错误的可能性。
3、优势
注意:在枚举中,分配给其成员的数值可以属于任何整数数据类型,如 byte、int、short、long、ushort等。默认情况下,枚举成员为 int 类型。
示例
1、 定义枚举类型,未对枚举的成员分配任何值时,则默认为第一个成员分配值0,其后成员值将递增1。
public enum UserStatus{ /// <summary> /// 活动 /// </summary> Activity, /// <summary> /// 已阻止 /// </summary> Blocked, /// <summary> /// 已删除 /// </summary> Deleted, /// <summary> /// 不活动 /// </summary> Inaction}
2、 定义枚举类型时,显式为成员分配整数值。
public enum UserStatus{ /// <summary> /// 活动 /// </summary> Activity=1, /// <summary> /// 已阻止 /// </summary> Blocked=2, /// <summary> /// 已删除 /// </summary> Deleted=3, /// <summary> /// 不活动 /// </summary> Inaction=4}
3、为每个成员分配各种值时,修改 enum 成员的默认值将导致其他成员按顺序自动分配增量值
public enum UserStatus{ /// <summary> /// 活动 /// </summary> Activity, // =0 /// <summary> /// 已阻止 /// </summary> Blocked, // =1 /// <summary> /// 已删除 /// </summary> Deleted=5, /// <summary> /// 不活动 /// </summary> Inaction // =6}
4、为枚举的每个成员分配不同的值
public enum UserStatus{ /// <summary> /// 活动 /// </summary> Activity, // =0 /// <summary> /// 已阻止 /// </summary> Blocked, // =1 /// <summary> /// 已删除 /// </summary> Deleted=5, /// <summary> /// 不活动 /// </summary> Inaction // =6}
5、与 switch 语句组合使用
namespace Fountain.WinConsole.EnumDemo{ internal class Program { static void Main(string[] args) { UserStatus userStatus = UserStatus.Activity; switch (userStatus) { case UserStatus.Activity: break; case UserStatus.Inaction: break; case UserStatus.Deleted: break; default: break; } Console.ReadKey(); } }}
6、使用 GetNames 方法遍历所有值
namespace Fountain.WinConsole.EnumDemo{ internal class Program { static void Main(string[] args) { foreach (string enumName in Enum.GetNames(typeof(UserStatus))) { Console.WriteLine(enumName); } Console.ReadKey(); } }}
// 输出结果ActivityBlockedDeletedInaction
7、使用 GetValues 方法遍历所有值
namespace Fountain.WinConsole.EnumDemo{ internal class Program { static void Main(string[] args) { foreach (UserStatus status in Enum.GetValues(typeof(UserStatus))) { Console.WriteLine(status.ToString()); } Console.ReadKey(); } }}// 输出结果ActivityBlockedDeletedInaction
8、在枚举类型的定义中包含典型组合
使用枚举类型表示选项的组合,需将每个选项的枚举成员定义为位字段,且关联值应该是2的幂。然后可以使用按位逻辑运算符组合选择或交叉选择组合。声明枚举类型的位域,需使用Flags属性。namespace Fountain.WinConsole.EnumDemo{ internal class Program { static void Main(string[] args) { UserStatus userStatus = UserStatus.Blocked | UserStatus.Deleted | UserStatus.Inaction; // 输出 Blocked Deleted Inaction Console.WriteLine($"不可用状态{userStatus}");
UserStatus invalidStatus = UserStatus.Blocked | UserStatus.Inaction; // 输出 Blocked Inaction Console.WriteLine($"受阻或不活动的 {invalidStatus}");
Console.ReadKey(); } }
[Flags] public enum UserStatus { /// <summary> /// 活动 /// </summary> Activity= 0b_0000_0000, // 0 /// <summary> /// 已阻止 /// </summary> Blocked= 0b_0000_0001, // 1 /// <summary> /// 已删除 /// </summary> Deleted= 0b_0000_0010, // 2 /// <summary> /// 不活动 /// </summary> Inaction= 0b_0000_0100 //4 }}
9、使用属性向枚举值添加说明【.NET Framework 4.7 以上】
using System.ComponentModel;
namespace Fountain.WinConsole.EnumDemo{ internal class Program { static void Main(string[] args) { UserStatus status = UserStatus.Deleted; var field = status.GetType().GetField(status.ToString()); var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)); string attributeName = attribute == null ? status.ToString() : attribute.Description; // 输出已删除 Console.WriteLine(attributeName); // Console.ReadKey(); } }
public enum UserStatus { /// <summary> /// 活动 /// </summary> [Description("活动")] Activity, /// <summary> /// 已阻止 /// </summary> [Description("已阻止")] Blocked, /// <summary> /// 已删除 /// </summary> [Description("已删除")] Deleted, /// <summary> /// 不活动 /// </summary> [Description("不活动")] Inaction }}
小结
以上是枚举的八种示例,希望本文对您有所收获,如有不到之处,请多多包涵。
该文章在 2024/11/18 9:07:18 编辑过