C# 枚举类型学习

C# 枚举类型的学习

  之前无论是学习什么语言总是比较懒得动手,就算是随笔也比较懒得记录。于是很悲剧的结果就出现了,一边学一边忘,对各种东西都是一知半解。到最后要用到的时候还得从头看过,这就等于白学了。所以想想,要真想掌握知识,还是得多实践多动手啊。所以从今天开始就边学边记吧。

  最近决定要把C#狠狠地啃一下,所以就从它开始吧。对于一眼看过去的东西就不记了,只记自己学习过程中不能立即理解的吧。

  废话少说,马上开始了。

枚举的定义

  在学习到复杂的变量类型时,被枚举类型卡了一下。没办法,不卡一下怎么叫复杂呢?不过自己之前没怎么用过,所以理解起来没那么直观。

  在MSDN上,枚举是这样定义的:枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。老实说,这句话有点拗口,看了两三遍才明白。我的理解是,枚举首先是一组整数常量,就跟数组一样。但是它跟数组不同的地方就是数组是只有数字组成的组合,例如:

int[] a = {0, 1, 2, 3, 4 };

 

而枚举则是一组有名字数组。什么意思呢?像上面的数组,里面的数组成员我不再使用数字表示出来,而是使用确切的单词来代替,例如:

Monday, Tuesday, Wednesday, Thursday, Friday

,但是它的数据类型还是int型。这时就变成了

int[] a =

{

Monday, Tuesday, Wednesday, Thursday, Friday

};

当然,这种写法是不存在的。枚举有枚举类型的定义格式。上面换成枚举类型的定义格式就会变成了:

enum Days {Monday, Tuesday, Wednesday, Thursday, Friday}; 

这样我们就定义好了一个枚举类型了,果然还是要写出来才能印象深刻啊啊啊啊啊。默认情况下,枚举类型的基本类型就是int,然后基本数值会从0开始一直递增到最后一个枚举成员。例如:Monday的数值为0,Tuesday的数值为1,以此类推。通过上面的阐述,我想可以认为,Monday就是1,而1就是Monday,就好像一个人有两个名字一样。这也是为什么MSDN中说枚举类型是一组命名整数常量了。在这里的话,数值也是可以自定义的,例如:

enum Days
        {
            Sat = 1,
            Sun = 3,
            Mon = 5,
            Tue = 7,
            Wed = 9,
            Thu = 11,
            Fri = 13
        };
View Code


此外枚举的类型也不是固定的,官方文档上列出来的就有byte, sbyte, short, ushort, int, uint, long, ulong这八种。要改变枚举成员的类型也很简单,例如:

enum Days : byte { Sat = 1, Sun = 3, Mon = 5, Tue = 7, Wed = 9, Thu = 11, Fri = 13 };

 

枚举的使用方法

既然理解了枚举类型是什么东西,那么接下来学下它有什么使用方法吧。

翻了一下,觉得以后或许会用到的会是这几个方法(不过实战经验少,瞎猜的):GetName()/GetNames(), GetValues(), ToString(), Parse()和枚举成员的显示转换。

GetName(enumType, value):在枚举类型中查找具有指定值的常数的名称,在上面的例子中,知道value=3时的名称,可以这样用,GetName(Enum.GetName(typeof(Days)), 3), 这时就会返回string类型的Sun了;

GetNames(enumType):查找指定枚举中常数名称的数组,同样上面的例子来说明,使用GetNames(Enum.GetName(typeof(Days))), 这时就会返回一个string[] = {Sat, Sun, Mon, Tue, Wed, Thu, Fri}数组;

GetValues():查找指定枚举中常数值的数组,使用上面的例子是,GetValues(Enum.GetName(typeof(Days))),但是返回的是Array类型,如果此时直接打印出来的话显示的并不是常数值,而是和GetNames显示的一样,必须通过显示转换才行。在这里我觉得它和GetNames的差别在于,GetValues()将枚举成员的命名加值到获取了,但是GetNames()仅仅是获取了命名。

ToString():将实例的值转换为等效字符串表示形式。

Parse():将一个或者多个枚举常数的名称或者数字值字符串表示转换成等效的枚举对象。对于这个方法不是很理解,特别是MSDN上的那句话:如果 value 是一个不与 enumType 的命名常数对应的名称,则此方法将引发 ArgumentException 如果 value 是一个不表示 enumType 枚举基础值的整数的字符串表示形式,则此方法将返回基础值是已转换为整型的 value 的枚举成员。 如果不希望此行为发生,则请调用 IsDefined 方法以确保整数的特定字符串表示形式实际是 enumType 的成员。

暂时先学到这里吧,不懂的地方太多,要慢慢来,后面加深了解之后再修改补充了。

顺便附上练习代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication3
 8 {
 9     class EnumTest
10     {
11         enum Days
12         {
13             Sat = 1,
14             Sun = 3,
15             Mon = 5,
16             Tue,
17             Wed = 6,
18             Thu,
19             Fri = 13
20         };
21 
22         [Flags]
23         enum Colors { None = 0, Red = 1, Green = 2, Blue = 4 };
24 
25         static void Main(string[] args)
26         {
27 
28             //枚举数显示转换成整数
29             int x = (int)Days.Sat;
30             int y = (int)Days.Thu;
31             Console.WriteLine("Sun={0}, Tue={1}", x, y);
32 
33             //
34             string sat = Enum.GetName(typeof(Days), 5);
35             //枚举成员被转换成字符串形式表示
36             string re = ((Days)6).ToString();
37             Console.WriteLine("string sat=" + sat);
38             Console.WriteLine("string re=" + re);
39 
40             //查找指定枚举中常数名称的数组
41             string[] a = Enum.GetNames(typeof(Days));
42             foreach (string i in a)
43             {
44                 Console.WriteLine("string=" + i);
45             }
46 
47             Array b = Enum.GetValues(typeof(Days));
48             foreach (var i in b )
49             {
50                 Console.WriteLine("value=" + i);
51                 Console.WriteLine((int)i);
52             }
53 
54 
55             string[] colorStrings = { "0", "2", "8", "blue", "Blue", "Yellow", "Red, Green" };
56             foreach (string colorString in colorStrings)
57             {
58                 try
59                 {
60                     Colors colorValue = (Colors)Enum.Parse(typeof(Colors), colorString);
61                     if (Enum.IsDefined(typeof(Colors), colorValue) | colorValue.ToString().Contains(","))
62                         Console.WriteLine("Converted '{0}' to {1}.", colorString, colorValue.ToString());
63                     else
64                         Console.WriteLine("{0} is not an underlying value of the Colors enumeration.", colorString);
65                 }
66                 catch (ArgumentException)
67                 {
68                     Console.WriteLine("'{0}' is not a member of the Colors enumeration.", colorString);
69                 }
70             }
71             
72 
73             Console.ReadKey();
74             
75         }
76     }
77 }
View Code

 

 

 

 

posted @ 2013-10-10 21:47  SanCode  阅读(286)  评论(0)    收藏  举报