在C#语言中 有一种数据类型-枚举(ENUM)。按照MSDN的说法,枚举是值类型的一种特殊形式,它从 System.Enum 继承而来,并为基础的基元类型的值提
供替代名称。枚举类型有名称、基础类型和一组字段。即枚举是一种“值类型”的数据类型,每个字段包含“名”与“值”两部分。每个枚举都是这样一组名值
对组成的枚举数列表。比如:
enum FontStyle
{
Bold=1,
Italic=2,
Underline=4
}
枚举FontStyle就有三组这样的枚举数列表。其中,1,2,4是“值”;Bold,Italic,Underline是“名”。此外,每个枚举的值的类型都有一个基础类型(基元类型)
-即除char以外的整型(int,short,等)。
了解了枚举的定义,下面看看它的性质。
当给第一个枚举数赋值后,其后的枚举数值会一次递增1个单位。即,若在上述例子中不给Italic,Underline赋值的话,他们的值分别为:2,3。从这些来看,枚
举实质上就是一些定义了值的常量,有常数名,常数值。但是,枚举有着与常量不同的优点,它不但可以根据“名”得到值,而且可以根据“值”获得名。另外
,如果在声明枚举时,在其前包含一个“标志”[Flags],那么该枚举的值就可以作为“位域”被处理。位域就是特殊的枚举,可以使用位“操作符”运算后以产生
未命名的值。此时,枚举中的“值”就成了一位一位的“标志”。如,将上述枚举FontStyle改为:
[Flags]
enum FontStyle
{
Bold=1,
Italic=2,
Underline=4
}
那么当给的值为3时,在位域中标志1和标志2进行位操作(将标志相加)后为3,将会得到Bold,Italic。而3在上述枚举中是不存在的。这样操作位域就可以列出
可以同时出现的情况了。值得注意的是,在上述情况中,3是1与2的位操作的结果即二者的和,所以,采用标志时,每个枚举数的值就不能等于另外任意个值的
和。这是因为对位域进行操作时,将在值中搜索标志,从具有最大值的标志到具有最小值的标志进行搜索。所以,当该给出的值在位域中如果有,则返回相应的
常数名;当给出的值在位域中有一组标志的和时,则返回用分隔符分割的常数名列表;如果给出的值不在位域且不等于已命名的标志的和则返回给出值的十进制
数。可见,如果已命名(如Bold)的常数值等于其他两个常数的值的和(如6),则在位域中查找6时只能返回该常数(Bold),而另外的组合就不会返回(如
Italic,Underline的和为6),因为在位域中是按照标志从大到小查找的。在使用标志情况下,枚举的值应依次为2的(n-1)次幂。
最后说说,枚举的常用方法。
0。声明枚举
Week并标志flags
 [Flags]
    enum Week
    {
        星期日 = 1,
        星期一 = 2,
        星期二 = 4,
        星期三 = 8,
        星期四 = 16,
        星期五 = 32,
        星期六 = 64,
    }
下面测试,
1。得到Week的类型:typeof(Week)。
2。得到Week的常数值的基元类型:Enum.GetUnderlyingType(typeof(Week))。
3。得到Week中的常数名称:Enum.GetNames(typeof(Week)),返回string类型的常数名称数组。
4。得到Week中的常数值:Enum.GetValues(typeof(Week)),返回array类型的常数值数组。
5。其他的常用方法见下面示例,或查询MSDN。
本文,只是本人的浅显认识,不对之处,敬请指出。
 static void Main(string[] args)
        {
            Console.WriteLine("\r\n------枚举类型举例---------\r\n");  
            Console.WriteLine(typeof(Week).ToString());       
  Console.WriteLine("Week枚举的基础类型 " + Enum.GetUnderlyingType(typeof(Week)));  
            Console.Write("--常数的值--");
            Console.Write("--常数名称--");
            foreach (string str in Enum.GetNames(typeof(Week)))
            {
                Console.Write(str+" ");
            }
            Console.WriteLine();        
         
            foreach (var v in Enum.GetValues(typeof(Week)))
            {
                Console.Write((int)v+" ");
            }
            Console.WriteLine();    
            Console.WriteLine("是否定义常数值为3的? " + Enum.IsDefined(typeof(Week), 3));    
            Console.WriteLine("星期三的值? " + (int)(Week)Enum.Parse(typeof(Week), "星期三"));       
            Console.WriteLine("以16进制表示值为4的值 "+Enum.Format(typeof(Week), 4, "X"));
            Console.WriteLine("以10进制表示值为4的值 " + Enum.Format(typeof(Week), 4, "D"));          
            Console.WriteLine("返回12对应的常数名或常数名组合,否则返回12 "+Enum.Format(typeof(Week), 12, "G"));
            Console.WriteLine("用法同上,只是不需要标志flags "+Enum.Format(typeof(Week), 4, "F"));     
            Console.ReadLine();
        }