C#枚举类型

代码中处理性别数据,使用数值表示时可以使用0表示未知,1表示男,2表示女;但在代码中只看到0、1、2,并不能很清晰地理解其含义;改进代码时,可以使用常量表示,如下面的代码:

C#
using System;

namespace csfx_demo
{
    class Program
    {
        static void Main(string[] args)
        {
            const int SEX_UNKNOW = 0;
            const int SEX_MALE = 1;
            const int SEX_FEMALE = 2;
            //
            int sex = SEX_MALE;
            Console.WriteLine(sex);  // 1
        }
    }
}

枚举类型(enum)的意义就在于,可以使用可读性更高的标识将相关数据组织在一起。C#中的枚举为值类型,使用enum关键字定义,如下面的代码。

C#
using System;

namespace csfx_demo
{
    //
    enum Sex : int
    {
        Unknow = 0,
        Male = 1,
        Female = 2
    }
    //
    class Program
    {
        static void Main(string[] args)
        {
            Sex sex = Sex.Male;
            Console.WriteLine(sex);  // Male
        }
    }
}

代码中,首先使用enum关键字定义了Sex枚举类型,类型名后面使用冒号(:)分隔指定了枚举成员对应的数据类型,这里使用int类型,而int也是枚举成员的默认类型,也就是说,代码中定义的Sex枚举类型与下列代码定义的Sex枚举类型是相同的。

C#
    enum Sex
    {
        Unknow = 0,
        Male = 1,
        Female = 2
    }

Main()方法中,定义Sex枚举类型的变量sex,并指定其值为Sex.Male,显示为Male。

代码中,还可以在枚举成员和对应数据之间进行转换,如下面的代码。

C#
using System;

namespace csfx_demo
{
    //
    enum Sex : int
    {
        Unknow = 0,
        Male = 1,
        Female = 2
    }
    //
    class Program
    {
        static void Main(string[] args)
        {
            Sex sex = Sex.Male;
            Console.WriteLine((int)sex);  // 1
            Console.WriteLine((Sex)1);   // Male
            Console.WriteLine(Enum.IsDefined(sex.GetType(), "Male"));  // True
            Console.WriteLine(Enum.IsDefined(sex.GetType(), "Boy"));  // False
            Console.WriteLine(Enum.IsDefined(typeof(Sex), 1));  // True
            Console.WriteLine(Enum.IsDefined(typeof(Sex), 99));  // False
        }
    }
}

代码中,第一个输出会将枚举值转换为int类型,第二个输出将整数1转换为枚举值。第三和第四个输出使用了Enum.IsDefined()方法判断枚举值是否存在,参数一使用sex.GetType()方法获取sex变量的Type对象,参数二使用字符串形式指定枚举值。第五和第六个输出同样使用Enum.IsDefined()方法判断枚举成员对应的数值是否存在,参数一使用typeof运算符获取Sex类型的Type对象,参数二则指定数值。

此外,定义枚举类型时也可以不指定枚举成员对应的数值,此时,枚举成员的数值会从0开始递增,如下面的代码。

C#
using System;

namespace csfx_demo
{
    //
    enum Sex : int
    {
        Unknow,
        Male,
        Female
    }
    //
    class Program
    {
        static void Main(string[] args)
        {
            Sex sex = Sex.Unknow;
            Console.WriteLine((int)sex);  // 0
            Console.WriteLine((Sex)1);   // Male
        }
    }
}

实际应用中,多个枚举成员还可以使用相同的数值,如下面的代码。

C#
using System;

namespace csfx_demo
{
    //
    enum Sex : int
    {
        Unknow = 0,
        Male = 1,
        Female = 2,
        Man = 1,
        Woman = 2,
        Boy = 1,
        Girl = 2
    }
    //
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine((int)Sex.Male);  // 1
            Console.WriteLine((int)Sex.Man);  // 1
            Console.WriteLine((int)Sex.Boy);  // 1
        }
    }
}

比较枚举值时,相同数值的枚举值是相等的,但不能使用枚举值和数值进行比较。下面的代码演示了枚举值是否相等的比较运算。

C#
using System;

namespace csfx_demo
{
    //
    enum Sex : int
    {
        Unknow = 0,
        Male = 1,
        Female = 2,
        Man = 1,
        Woman = 2,
        Boy = 1,
        Girl = 2
    }
    //
    class Program
    {
        static void Main(string[] args)
        {
            Sex sex = Sex.Male;
            Console.WriteLine(Sex.Male == Sex.Boy);  // True
            Console.WriteLine(sex == Sex.Man);  // True
            Console.WriteLine(Sex.Male == (Sex)1);  // True
        }
    }
}