关于C#的enum枚举
时间:2011-02-28 来源:craig
a、枚举是用户定义的整数值类型,在声明一个枚举时,要指定该枚举可以包含的一组可接受的实例值,还可以给值指定易于记忆的名称
b、如果在代码中试图把一个不在可接受值范围内的值赋予枚举的一个实例,编译器就会报告一个错误。(VB中的枚举是不会报错的)
c、C#在大括号外面不需要分号,而C++则必须使用。
d、C#中的enum明显比C++给力很多,它会在后台实例化为派生于基类System.Enum的结构,这样一来,很多函数可以调用而不用自己写咯~
备注:
System.Enum 类型是所有枚举类型的抽象基类,并且从 System.Enum 继承的成员在任何枚举类型中都可用。
System.Enum 本身不是枚举类型。相反,它是一个类类型,所有枚举类型都是从它派生的。
System.Enum 从类型 System.ValueType派生(这个就不懂了。。。先记下来吧,以后慢慢看)
(1)枚举的声明:枚举声明用于声明新的枚举类型。
访问修辞符 enum 枚举名:基础类型
{
枚举成员
} (这里C#不需要加分号哦~)
基础类型必须能够表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。
枚举的声明必须要定义在主函数外面。
(2)枚举成员
枚举成员是该枚举类型的命名常数。每个枚举成员名称唯一且均具有相关联的常数值,此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。
示例:
public enum TimeofDay:uint
{
Morning=-3,
Afternoon=-2,
Evening=-1
}
产生编译时错误,原因是常数值 -1、-2 和 –3 不在基础整型 uint 的范围内。
注意:为所有的每句成员加上注释是很必要的,否则别人看到你的成员里面那么多不认识的单词甚至缩写有多么痛苦……
(3)枚举成员赋值
规则:允许多个枚举成员有相同的值,允许无顺序地定义成员值,没有显式赋值的成员的值默认为上一个成员的值+1(第一个成员如果没赋值的话默认就是0)。另外,枚举值都不能超过它的基础类型范围。
示例
public enum Color
{
red = 1,
green,
orange = 1,
grey = 5,
purple
}
上面green的值为2,而purple的值则为6。 red和orange同为1。
注意:正是由于默认+1这样的规则,建议每个成员都手动赋值,以免出现程序写到一半,从前面改动或者增加成员的时候,后面的成员默认值都会改变,这就麻烦了。
(4)枚举类型与基础类型的转换
基础类型不能隐式转换为枚举类型
枚举类型也不能隐式转换为基础类型
示例:
public enum Number
{
a,
b
}
class Test
{
public static void Main()
{
int i = Number.a;//错误,要强制类型转换(int)Number.a
Number n;
n = 2//又错误,要强制类型转换(Number)2
}
}
(5)枚举类型的使用
switch(timeofDay) //switch中的使用
{
case TimeofDay.Morning:
Console.WriteLine("good morning");
break;
//……其他的省略啦
}
int hashCode = timeofDay.Morning.GetHashCode();//得到枚举成员的值
string str = timeofDay.Morning.toString();//得到枚举成员的名字
string enumParseStr = Enum.Parse(typeof(timeofDay) , hashCode.ToString()).toString();//将枚举的值转换成对应的名字
int enumParseInt = Convert.ToInt32(Enum.Parse(typeof(timeofTime), str));//将枚举的名字转换成对应的值