关于枚举

今天想写一下关于枚举的文章,脑海里的思路有限,所以上网找博文来看,发现的一位大牛的作品,甚喜,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.美
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值