C# 枚举(Enum)


C# 枚举(Enum)

简介

C# 枚举(Enum)是一种将不同变量或常量用一个共同的名称和值关联起来的类型。通常,使用枚举可以让代码更加清晰、易读,同时也可以提高代码的可维护性。

语法

声明一个枚举的语法如下:

enum EnumName {
   EnumValue1,
   EnumValue2,
   ...
   EnumValueN
}

其中 EnumName 是枚举的名称,EnumValue1EnumValueN 是枚举的值。在该语法中,每个值都是整数类型,并且默认从0开始递增。

基本用法

假设我们有一个枚举,代表一周的七天:

enum WeekDays {
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

可以使用以下方式来定义一个变量并赋值:

WeekDays day = WeekDays.Monday;

可以使用 switch 语句来处理枚举类型的值:

switch(day)
{
    case WeekDays.Monday:
        Console.WriteLine("Today is Monday.");
        break;
    case WeekDays.Tuesday:
        Console.WriteLine("Today is Tuesday.");
        break;
    case WeekDays.Wednesday:
        Console.WriteLine("Today is Wednesday.");
        break;
    case WeekDays.Thursday:
        Console.WriteLine("Today is Thursday.");
        break;
    case WeekDays.Friday:
        Console.WriteLine("Today is Friday.");
        break;
    case WeekDays.Saturday:
        Console.WriteLine("Today is Saturday.");
        break;
    case WeekDays.Sunday:
        Console.WriteLine("Today is Sunday.");
        break;
}

也可以使用 if-else 语句来处理枚举类型的值:

if (day == WeekDays.Saturday || day == WeekDays.Sunday) {
    Console.WriteLine("It's the weekend!");
} else {
    Console.WriteLine("It's a weekday.");
}

添加属性

枚举可以添加属性来进一步定义其语义。例如,我们可以为每个枚举值添加一个包含详细说明的 Description 属性:

using System;
using System.ComponentModel;
using System.Reflection;


enum Planet
{
    [Description("The hot and fiery planet closest to the sun.")]
    Mercury,

    [Description("A beautiful blue planet, the home of humanity.")]
    Earth,

    [Description("The sixth planet from the sun, known for its stunning rings.")]
    Saturn
}


public static class EnumExtensions
{
    public static string GetDescription<T>(this T enumerationValue) where T : struct
    {
        Type type = enumerationValue.GetType();
        if (!type.IsEnum)
        {
            throw new ArgumentException($"{nameof(enumerationValue)} must be an Enum type");
        }

        MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString());
        if (memberInfo != null && memberInfo.Length > 0)
        {
            object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attrs != null && attrs.Length > 0)
            {
                return ((DescriptionAttribute)attrs[0]).Description;
            }
        }

        return enumerationValue.ToString();
    }
}


class Program
{
    static void Main(string[] args)
    {
        Planet planet = Planet.Mercury;
        Console.WriteLine($"{planet} - {planet.GetDescription()}");

        planet = Planet.Earth;
        Console.WriteLine($"{planet} - {planet.GetDescription()}");

        planet = Planet.Saturn;
        Console.WriteLine($"{planet} - {planet.GetDescription()}");
    }
}

GetDescription 方法通过反射获取枚举值的 DescriptionAttribute 属性并返回其值。运行程序得到的输出是:

Mercury - The hot and fiery planet closest to the sun.
Earth - A beautiful blue planet, the home of humanity.
Saturn - The sixth planet from the sun, known for its stunning rings.

底层类型

枚举的底层类型是整数类型,可以使用 Enum.GetUnderlyingType 方法获取:

enum Color : short
{
    Red,
    Green,
    Blue
}


class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Enum.GetUnderlyingType(typeof(Color)));  // System.Int16
    }
}

总结

C# 枚举是一种将不同变量或常量用一个共同的名称和值关联起来的类型,它可以让代码更加清晰、易读,同时也可以提高代码的可维护性。枚举的基本用法是声明一个枚举,定义每个值,并使用它们来定义变量。我们可以使用 switchif-else 语句来处理枚举类型的值。通过为枚举值添加属性,我们可以进一步定义其语义。枚举的底层类型是整数类型,可以使用 Enum.GetUnderlyingType 方法获取。