8.1 枚举介绍
枚举是值类型的一种,包含一组命名的常量,枚举就是一个数据类型,就叫枚举类型,同样也是用来存储数据的。
8.2 枚举的用处
1)比如在案例中,需要重复使用到星期一到星期天这些特定的字符串,就可以来定义一个叫做星期的枚举。如果不定义成枚举,可能写法就有很多种了,比如周一、星期一、Monday等,这三种都表示同一天。
2)比如在切水果游戏中,里面有很多类型的水果,香蕉、苹果、橘子、西瓜……等,这个时候就可以定义一个叫水果的枚举类型,用于存储水果种类。
3)比如在游戏中,通常有很多职业,战士、法师、射手……等多种类型的职业,就可以定义一个叫职业的枚举类型。或者有很多类型的枪械,冲锋枪、步枪、手枪、狙击枪等,就可以定义一个叫枪械的枚举类型。
8.3 枚举语法
[public] enum 枚举名
{
值1,
值2,
值3,
……
}
public:访问修饰符,公开的公共的,哪儿都可以访问。
enum:关键字,声明枚举的关键字。
枚举名:要符合Pascal命名规范。
注意:
将枚举声明到命名空间下面,类的外面,表示这个命名空间下,所有的类都可以使用这个枚举。
枚举就是一个变量类型,只是枚举声明、赋值、使用的方式跟那些普通的变量类型不一样。
可以声明枚举类型的变量, 如变量 c1, 用枚举类型的名称作为前缀,设置一个命名常量,来赋予枚举中的一个值。
默认情况下,enum的类型是int,枚举的第一个成员将为0,每个连续枚举成员的值将增加1。
默认枚举值
enum WeekDays
{
Monday, // 0
Tuesday, // 1
Wednesday, // 2
Thursday, // 3
Friday, // 4
Saturday, // 5
Sunday // 6
}
为枚举成员分配值
可以为枚举成员分配不同的值。枚举成员的默认值的更改将自动按顺序向其他成员分配增量值。
甚至可以为每个成员都分配不同的值。
enum WeekDays
{
Monday, // 0
Tuesday, // 1
Wednesday = 3, // 3
Thursday, // 4
Friday, // 5
}
字节枚举
枚举可以是任何数字数据类型,例如 byte,sbyte,short,ushort,int,uint,long 或 ulong。但是,枚举不能为字符串类型。
在enum后指定继承类型为:type。下面定义了字节 enum。
enum Fruits: byte
{
Apple = 1,
Banana = 5,
Pear = 6,
Watermelon = 10,
Strawberry = 11,
Pineapple = 15
}
8.4 枚举转换实例
基础实例
class Program
{
public enum Color
{
Red, //若修改为Red=1,则序号依次累加,默认为0
Green,
Blue //注意最后一个常量值逗号可以省略
}
static void Main(string[] args)
{
Color c1 = Color.Red;
Console.WriteLine(c1);
}
}
输出结果:
Red
枚举类型 强转 int类型
枚举列表中的每个符号代表一个整数值,一个比它前面的符号大的整数值,默认情况下,第一个枚举符号的值是0。将枚举类型强转为int类型时,默认情况下枚举元素下标从0开始,具体用法如下:
public enum Color
{
Red, //默认为0,若修改为Red=1,则序号依次累加
Green,
Blue //注意最后一个常量值逗号可以省略
}
class Program
{
static void Main(string[] args)
{
int x = (int)Color.Red;
int y = (int)Color.Blue;
Console.WriteLine("Red={0}\nBlue={1}",x,y);
}
}
输出结果:
Red=0
Blue=2
int类型 强转 枚举类型
如果按元素下标能成功将int类型转换成枚举类型时,就转换成相应的枚举元素的值,如果转换失败,就输出相应的int值。
//声明一个枚举类型Week
public enum Week
{
星期一 = 10,
星期二,
星期三
}
class Program
{
static void Main(string[] args)
{
Week week = (Week)3;
Console.WriteLine(week);
Console.WriteLine((Week)10);
Console.WriteLine((Week)100);
Console.ReadKey();
}
}
输出结果:
3
星期一
100
枚举类型和string类型
8.5 枚举和string
所有的类型都能转换成string类型,包括枚举类型,调用ToString()。
枚举类型 转换 string类型
语法:
Week week=Week.星期一;
week.ToString();
可以将枚举类型与int类型和string类型相互转换。枚举类型默认和int类型时相互兼容的,所以可以通过强制类型转换的语法互相转换。当转换一个枚举中没有的值时,不会抛异常,而是将数字直接显示出来。
string类型 转换 枚举类型
语法:
要转换的枚举类型 标识符 = (要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型),"要转换的字符串");
如果转换的字符串是数字,则就算枚举中没有,也会不会抛异常。
如果转换的字符串是文本,如果枚举中没有,则会抛出异常。
8.6 枚举案例练习
用户选择一个在线状态,接受后将用户的输入转换成枚举类型,再次打印到控制台中。
public enum QQState
{
OnLine=1,
OffLine,
Leave,
Busy,
QMe
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请选择您的qq在线状态 1--OnLine 2--offLine 3--Leave 4--Busy 5--QMe");
string input = Console.ReadLine();
switch (input)
{
case "1":
QQState s1 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}", s1);
break;
case "2":
QQState s2 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}", s2);
break;
case "3":
QQState s3 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}", s3);
break;
case "4":
QQState s4 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}", s4);
break;
case "5":
QQState s5 = (QQState)Enum.Parse(typeof(QQState), input);
Console.WriteLine("您选择的在线状态是{0}", s5);
break;
}
Console.ReadKey();
}
}