今天比较几个项目的身份验证时看到了某个页面出现了enum枚举,但是没有具体的使用,找了几本书,发现下面这本说得很好很简单,尤其将枚举和位域的区分,很明确。便摘了出来,以供参考。
摘自:精通.Net核心技术原理与构架
Enum 枚举类型,属于值类型。
枚举(enum)是值类型的一种特殊形式,它从System.Enum继承而来,并为基础的值提供替代名称。枚举类型有名称、基础类型和一组字段。基础类型必须是一个内置的有符号(或无符号)整数类型(如Byte,Int32,或Uint64)。字段是静态文本字段,其中的每一个字段都表示常数。同一个值可以分配给多个字段。出现这种情况时,必须将其中的某个值标记为主要枚举值,以便进行反射和字符串转换。可以将基础类型的值分配给枚举,反之亦然(运行库不要求强制转换)。可创建枚举类型的实例,并调用System.Enum的方法以及对枚举的基础类型定义的任何方法。但是某些语言可能不允许在要求基础类型的实例时作为参数传递枚举(反之亦然)。对于枚举还有以下的限制:
1. 它们不能定义自己的方法
2. 它们不能实现接口
3. 它们不能定义属性和事件
Flags 属性表示一种特殊的枚举。称为位域。运行库本身不区分传统枚举与位域,但是某些.NET编程语言可能区分二者。当区分二者的时候,可以对位域(而不是枚举)使用位操作符以产生未命名的值。枚举一般用于列出唯一的元素,如一周的各天,国家或地区名称等。位域一般用于列出可能联合发生的质量和数量,比如Red and Big and Fast。
以下代码示例说明如何使用位域和传统枚举。
[Visual Basic]
【省略】
[C#]
using System;
using System.collections;
//传统的枚举类型
Public enum SomeRootVegetables
{
HorseRadish,
Radish,
Tumip
}
//位域枚举类型
[Flags]
Public enum Seasons
{
None = 0,
Summer = 1,
Autumn = 2,
Winter = 4,
Spring = 8,
All = Summer | Autumn | Winter | Spring
}
//用于测试的类
public class EnumerationSample
{
public static void Main()
{
//生成哈希表
Hashtable AvailableIn = new Hashtable();
AvailableIn[SomeRootVegetables.HorseRadish] = Seasons.All;
AvailableIn[SomeRootVegetables.Radish] = Seasons.Spring;
AvailableIn[SomeRootVegetables.Tumip] = Seasons.Spring | Seasons.Autumn;
//季节数组
Seasons[] seasons = new Seasons(){Seasons.Winter,Seasons.Spring,
Seasons.Summer,Seasons.Autumn};
//显示每个季节可以食用的蔬菜
for(int i = 0;i < seasons.Length;i++)
{
Console.WriteLine(""r"n 下面的蔬菜的食用季节为" + seasons[i].ToString() + ";");
foreach(DictionaryEntry e in AvailableIn)
{
//位比较
if(( Seasons )e.Value & seasons[i]) > 0)
{
Console.WriteLine(""t" + ((SomeRootVegetables)e.Key).ToString());
}
}
}
}
}
}
执行结果如下图所示。
从执行结果可以看出,枚举类型的ToString()方法,自动将值转化为表示该值的字符串。
下面的蔬菜的食用季节为Winter
HorseRadish
下面的蔬菜的食用季节为Spring
Turnip
Radish
HorseRadish
下面的蔬菜的食用季节为Summer
HorseRadish
下面的蔬菜的食用季节为Autumn
Turnip
HorseRadish
【over】 2007-01-15