C#学习篇之基础回顾(1)----- 枚举类型

枚举类型是一组给变量提供指定赋值的组合

如定义一个Day变量,只能赋值周一到周日,则可以用枚举进行限定

enum Day
{
     Sunday,
     Monday,
     Tuesday,
     Wednesday,
     Thursday,
     Friday,
     Saturday
};

Day d = Day.Sunday;

枚举位标识

每一个枚举类型都有一个从0开始的默认的位标识,使用(int)d可以显示转换为整数来输出标识,也可以手动赋予标识。既然可以获取枚举类型的位标识,也可以通过位标识来赋值,如:

Day d = (Day)1;

有趣的是,还可以给枚举类型赋值单个字符,如’T’,如果是超过2个字符则会提示字符太多报错,说明位标识还是会将单个字符转换为int类型进行存储,如:

enum Day
{
     Sunday,
     Monday,
     Tuesday='T',
     Wednesday,
     Thursday,
     Friday,
     Saturday=10
};
……
Day d = Day.Sunday;
Day t = (Day)'T';
Day s = (Day)10;
Console.WriteLine("{0},{1},{2}", d, t, s);
Console.WriteLine("{0},{1},{2}", (int)d, (char)t, (int)s);

运行结果:

Sunday,Tuesday,Saturday

0,T,10

枚举的位标识可以是除 char 以外的任何整型,默认是int类型,还支持byte、sbyte、short、ushort、uint、long 或 ulong等整型类型。如果需要使用其他的整数类型,就需要进行声明类型,否则超出int类型的范围会报错,格式如:

enum Day:long
{
     Sunday=10000000000,
}

这里需要注意的是,成员位标识默认会根据上一个成员的标识加1,例如将上面Wednesday的位标识修改为100,则无法再用原来的(Day)4获得Thursday的值,而是变成(Day)101,后面的成员依次加1。

枚举描述(Description

一般我们在使用枚举变量的时候可能还需要输出指定的内容,比如sunday就输出周日,就需要使用if-else进行循环判断。这里介绍一个枚举类型的特性,就是可以通过Description给枚举成员添加并输出描述,例子如下:

using System;
using System.ComponentModel;//用于支持Description
using System.Reflection;//用于支持FieldInfo

[Description("星期")]
enum Day
{
    [Description("周日")]
    Sunday = 100,
    [Description("周一")]
    Monday,
    [Description("周二")]
    Tuesday,
    [Description("周三")]
    Wednesday,
    [Description("周四")]
    Thursday,
    [Description("周五")]
    Friday,
    [Description("周六")]
    Saturday
};
namespace Test
{
    static class Program
    {
        static void Main(string[] args)
        {
            Day d = Day.Sunday;
            Day t = (Day)101;
            Day s = (Day)102;
            Console.WriteLine("{0},{1},{2}", d, t, s);

            //string today = GetDescription(s, true);
            Console.WriteLine("{0},{1},{2}", GetDescription(d, true), GetDescription(t, true), GetDescription(s, true));
            Console.ReadKey();
        }

        /// <summary>
        /// 获取枚举类型对应的描述
        /// </summary>
        /// <param name="value"></param>枚举成员的值
        /// <param name="nameInstead"></param>枚举成员是否包含描述
        /// <returns></returns>
        public static string GetDescription(this Enum value, Boolean nameInstead = true)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name == null)
            {
                return null;
            }

            FieldInfo field = type.GetField(name);
            DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribut e;

            if (attribute == null && nameInstead == true)
            {
                return name;
            }
            return attribute == null ? null : attribute.Description;
        }
    }
}

运行结果:Sunday,Monday,Tuesday

                  周日,周一,周二

猜你喜欢

转载自blog.csdn.net/York_New/article/details/81611407