前言
在 .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();
}
}
}
// 输出结果
Activity
Blocked
Deleted
Inaction
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();
}
}
}
// 输出结果
Activity
Blocked
Deleted
Inaction
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 编辑过