标签:other 成员类 img 工具 title res get nan mem
枚举是由程序员定义的类型与类或结构一样。
例:枚举示例
关键字 枚举名称 ↓ ↓ enum TrafficLight { Green, ← 逗号分隔,没有分号 Yellow, Red }
每个枚举类型都有一个底层整数类型,默认为int。
var t1=TrafficLight.Green; var t2=TrafficLight.Yellow; var t3=TrafficLight.Red; Console.WriteLine("{0},\t{1}",t1,(int)t1); Console.WriteLine("{0},\t{1}",t2,(int)t2); Console.WriteLine("{0},\t{1}",t3,(int)t3);
可以把冒号和类型名放在枚举名之后,这样就可以使用int以外的整数类型。类型可以是任何整数类型。所有成员常量都属于枚举的底层类型。
enum TrafficLight:ulong { ... }
成员常量的值可以是底层类型的任何值。枚举成员不能有重复的名称,但可以有重复的值。
enum TrafficLight { Green =10, Yellow =15, Red =15 }
如果不初始化一个成员常量,编译器隐式给它赋一个值。
例:
enum CardSuit { Hearts, //0 因为这是第一项 Clubs, //1 比之前大1 Diamonds, //2 比之前大1,下面的以此类推 Spades, MaxSuits } enum FaceCards { //Member //所赋的值 Jack =11, //11 显式设置 Queen, //12 比之前大1 King, //13 比之前大1 Ace, //14 比之前大1 NumberOfFaceCards=4, //4 显式设置 SomeOtherValue, //5 比之前大1 HighestFaceCard=Ace //14 以上定义了Ace }
程序员们长期使用单个字(single word)的不同位作为一组开/关标志的紧凑方法。本节将其称为标志字(flag word)。枚举提供了实现它的简便方法。
一般步骤如下。
例:下面枚举表示纸牌游戏中的一副牌的选项。
[Flags] enum CardDeckSettings:uint { SingleDeck =0x01, //位0 LargePictures =0x02, //位1 FancyNumbers =0x04, //位2 Animation =0x08 //位3 }
要创建一个带有适当位标志的字,需要声明一个该枚举类型的变量,并使用按位或运算符设置需要的位。
CardDeckSettings ops= CardDeckSettings.SingleDeck |CardDeckSettings.FancyNumbers |CardDeckSettings.Animation;
判断标志字是否包含特定的位标志集,可以使用枚举类型中的HasFlag布尔方法。在标志字上调用HasFlag方法,并将要检查的位标志作为参数。如果设置了指定的位标志,HasFlag返回true,否则返回false。
bool useFancyNumbers=ops.HasFlag(CardDeckSettings.FancyNumbers);
HasFlag还可以检测多个位标志。
CardDeckSettings testFlags=CardDeckSettings.Animation|CardDeckSettings.FancyNumbers; bool useAnimationAndFancyNumbers=ops.HasFlag(testFlags);
另外一种判断是否设置了一个或多个指定为的方法是使用按位与运算符。
bool useFancyNumbers= (ops&CardDeckSettings.FancyNumbers)==CardDeckSettings.FancyNumbers;
[Flags] enum CardDeckSettings:uint { SingleDeck =0x01, //位0 LargePictures =0x02, //位1 FancyNumbers =0x04, //位2 Animation =0x08 //位3 }
Flags特性不会改变计算结果,但却提供了一些方便的特性。首先,它通知编译器、对象浏览器以及其他查看这段代码的工具,该枚举的成员不仅可以用作单独的值,还可以按位标志进行组合。这样浏览器就可以更恰当地解释该枚举类型的变量。
其次,它允许枚举的ToString方法位位标志的值提供更多的格式化信息,ToString方法以一个枚举值位参数,将其与枚举的常量成员相比较。如果与某个成员相匹配,ToString返回该成员的字符串名称。
例:没有Flags的枚举
enum CardDeckSettings:uint { SingleDeck =0x01, //位0 LargePictures =0x02, //位1 FancyNumbers =0x04, //位2 Animation =0x08 //位3 } class Program { static void Main() { CardDeckSettings ops; ops=CardDeckSettings.FancyNumbers; Console.WriteLine(ops.ToString()); ops=CardDeckSettings.FancyNumbers|CardDeckSettings.Animation; Console.WriteLine(ops.ToString()); } }
上面输出结果的第二行12=8+4。因为FancyNumbers将位设置为值4,Animation将位设置为值8。
然而,如果在枚举声明前加上Flags特性,将告诉ToString方法位可以分开考虑。运行包含Flags特性的代码,结果如下:
[Flags] enum CardDeckSettings:uint { SingleDeck =0x01, //位0 LargePictures =0x02, //位1 FancyNumbers =0x04, //位2 Animation =0x08 //位3 } class MyClass { bool UseSingleDeck =false, UseBigPics =false, UseFancyNumbers =false, UseAnimation =false, UseAnimationAndFancyNumbers =false; public void SetOptions(CardDeckSettings ops) { UseSingleDeck=ops.HasFlag(CardDeckSettings.SingleDeck); UseBigPics=ops.HasFlag(CardDeckSettings.LargePictures); UseFancyNumbers=ops.HasFlag(CardDeckSettings.FancyNumbers); UseAnimation=ops.HasFlag(CardDeckSettings.Animation); CardDeckSettings testFlags=CardDeckSettings.Animation|CardDeckSettings.FancyNumbers; UseAnimationAndFancyNumbers=ops.HasFlag(testFlags); } public void PrintOptions() { Console.WriteLine("Option settings:"); Console.WriteLine("Use Single Deck - {0}",UseSingleDeck); Console.WriteLine("Use Large Pictures - {0}",UseBigPics); Console.WriteLine("Use Fancy Numbers - {0}",UseFancyNumbers); Console.WriteLine("Show Animation - {0}",UseAnimation); Console.WriteLine("Show Animation And FancyNumbers - {0}",UseAnimationAndFancyNumbers); } } class Program { static void Main() { var mc=new MyClass(); CardDeckSettings ops=CardDeckSettings.SingleDeck |CardDeckSettings.FancyNumbers |CardDeckSettings.Animation; mc.SetOption(ops); mc.PrintOptions(); } }
枚举只有单一的成员类型:声明的成员常量
枚举类型名.成员名
例:直接访问枚举常量
Console.WriteLine("{0}",TrafficLight.Green);
枚举是一种独特的类型。比较不同枚举类型的成员会导致编译时错误。
例: 枚举比较
enum FirstEnum { Mem1, Mem2 } enum SecondEnum { Mem1, Mem2 } class Program { static void Main() { if(FirstEnum.Mem1<FirstEnum.Mem2) Console.WriteLine("True"); if(FirstEnum.Mem1<SecondEnum.Mem1) //错误,不同枚举类型 Console.WriteLine("True"); } }
.NET Enum类型还包括一些有用的静态方法:
例:GetName、GetNames示例
enum TrafficLight { Green, Yellow, Red } class Program { static void Main() { Console.WriteLine("Second member of TrafficLight is {0}\n",Enum.GetName(typeof(TrafficLight),1)); foreach(var name in Enum.GetNames(typeof(TrafficLight))) { Console.WriteLine(name); } } }
标签:other 成员类 img 工具 title res get nan mem
原文地址:http://www.cnblogs.com/moonache/p/6225313.html