今天想写一下关于枚举的文章,脑海里的思路有限,所以上网找博文来看,发现的一位大牛的作品,甚喜,http://www.cnblogs.com/allenlooplee/archive/2004/12/19/70230.aspx
如此水平我等晚辈实在佩服,很多东西只有自己总结过才会变成自己的,现在我把自己的薄见总结一下(有些是引用传智播客上的ppt)。
枚举关键字 enum 用法非常简单
enum season
{
spring,
summer,
autumn,
winter
}
Console.WriteLine((int)season.spring); Console.WriteLine((int)season.spring,season.spring);
打印出来是0和spring,也就说season其实就是一个简单的数值类型,我们可以看下il代码
.class auto ansi sealed nested private season
extends [mscorlib]System.Enum
{
.field public static literal valuetype 枚举.Program/season autumn = int32(2)
.field public static literal valuetype 枚举.Program/season spring = int32(0)
.field public static literal valuetype 枚举.Program/season summer = int32(1)
.field public specialname rtspecialname int32 value__
.field public static literal valuetype 枚举.Program/season winter = int32(3)
}
枚举也可以手动赋值
enum season
{
spring=2,
summer=3,
autumn=1,
winter
}
其对应的il代码
.class auto ansi sealed nested private season
extends [mscorlib]System.Enum
{
.field public static literal valuetype 枚举.Program/season autumn = int32(1)
.field public static literal valuetype 枚举.Program/season spring = int32(2)
.field public static literal valuetype 枚举.Program/season summer = int32(3)
.field public specialname rtspecialname int32 value__
.field public static literal valuetype 枚举.Program/season winter = int32(2)
}
大家应该有注意到value_这个字段,我们看一下大牛如何说的
引用:
标志枚举 (当可以具有多个状态时,普通枚举就不够用了(状态可以组合))
FileAttributes,普通枚举中的每个值是互斥的,而标志枚举中每个值是可以互相组合的。
[Flags]//看加Flags特性后,标志枚举的ToString()返回结果
public enum GoodPeople
{
高 = 1,
富 = 2,
帅 = 4,
白 = 8,
美 = 16,
优秀男 = GoodPeople.高 | GoodPeople.富 | GoodPeople.帅,
优秀女 = GoodPeople.白 | GoodPeople.富 | GoodPeople.美
}
public static void Main(string[] args)
{
long x =(long)Range.max;
long y=(long)Range.min;
Console.WriteLine("max={0}",x);
Console.WriteLine("min={0}",y);
枚举类型中的Range.max;Range.min;已经是long型的了
为什么还要强制转化如 long y=(long)Range.min;
“enum Range : long”中的 long 指定了枚举的底层类型(Underlying Type),即 Range 内部的 value_ 的类型。C# 允许你手动为 Range 的成员赋值,但该值必须与底层类型兼容,而这些值将会由编译器隐式转换为 Range,这一转换的实质是把对应的值赋予 Range 内部的 value_。也就是说 Range.max 并不是 long 而是 Range,这样的话,要从 Range.max 中取出内部的 value_ 的值,你就必须使用强制转换/显式转换,当然,目标类型必须是 Range 的底层类型或其兼容类型。