代码中处理性别数据,使用数值表示时可以使用0表示未知,1表示男,2表示女;但在代码中只看到0、1、2,并不能很清晰地理解其含义;改进代码时,可以使用常量表示,如下面的代码:
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关键字定义,如下面的代码。
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枚举类型是相同的。
enum Sex { Unknow = 0, Male = 1, Female = 2 }
Main()方法中,定义Sex枚举类型的变量sex,并指定其值为Sex.Male,显示为Male。
代码中,还可以在枚举成员和对应数据之间进行转换,如下面的代码。
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开始递增,如下面的代码。
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 } } }
实际应用中,多个枚举成员还可以使用相同的数值,如下面的代码。
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 } } }
比较枚举值时,相同数值的枚举值是相等的,但不能使用枚举值和数值进行比较。下面的代码演示了枚举值是否相等的比较运算。
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 } } }