关于枚举

来源:互联网 发布:职业证书报考网站域名 编辑:程序博客网 时间:2024/06/01 17:34

今天想写一下关于枚举的文章,脑海里的思路有限,所以上网找博文来看,发现的一位大牛的作品,甚喜,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_这个字段,我们看一下大牛如何说的
引用:

enum Range :long {max=3434L,min=15541L};
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 的底层类型或其兼容类型。
 
把String转换为枚举值:(enumertionType)Enum.Parse(typeof(enumerationType),enumerationValueString);
eg:   string myStr="spring";
        Season mySeason=(Season)Enum.Parse( typeof ( Season ) , mySeason );
当然,如果传送的一个值不能映射为枚举值中的一个,就会产生错误,另外大小写敏感。

标志枚举 (当可以具有多个状态时,普通枚举就不够用了(状态可以组合))

 

FileAttributes,普通枚举中的每个值是互斥的,而标志枚举中每个值是可以互相组合的。

[Flags]//看加Flags特性后,标志枚举的ToString()返回结果
    public enum GoodPeople
    {
        高 = 1,
        富 = 2,
        帅 = 4,
        白 = 8,
        美 = 16,
        优秀男 = GoodPeople.高 | GoodPeople.富 | GoodPeople.帅,
        优秀女 = GoodPeople.白 | GoodPeople.富 | GoodPeople.美
    }


 

原创粉丝点击