前言
在 .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 编辑过