这章节主要是1)反编译查看枚举的底层实现 2)字符串转枚举 3)枚举成员与其成员类型和其值之间的关系
反编译枚举
自定义的枚举被编译为一个类(.class);每一个枚举成员就是存储整形值的变量名,因此枚举成员在内存(栈)中的表示为
枚举类型一般用于为固定的值进行命名,如二十四节气,月份,星期,时分秒等等
之前说过的ConsoleColor(设置控制台前后背景色的)就是一个枚举类型
字符串转枚举
字符串转换枚举类型的固定格式
(T)Enum.Parse(typeof(T), str)
(Gender1)Enum.Parse(typeof(Gender1),"输入的字符串")
示例1:定义一个输入1-24的正整数字符串,打印输出二十四节气的大致日期
农历中的二十四节气反映的是地球绕太阳运行轨道上的不同位置即回归年周期,因此属于阴阳历中的阳历部分(某*家说的)
二十四节气指:立春、雨水、惊蛰、春分、清明、谷雨、立夏、小满、芒种、夏至、小暑、大暑、立秋、处暑、白露、秋分、寒露、霜降、立冬、小雪、大雪、冬至、小寒和大寒
使用枚举加switch-case结构的快捷键:先switch然后两下tab会补完到default,光标显示在switch后的变量这时输入枚举,输完后回车,自动补完所有枚举的case
//在命名空间内定义
enum Terms: byte
{
//编程规范:使用英文
立春=1, 雨水, 惊蛰, 春分, 清明, 谷雨,
立夏, 小满, 芒种, 夏至, 小暑, 大暑,
立秋, 处暑, 白露, 秋分, 寒露, 霜降,
立冬, 小雪, 大雪, 冬至, 小寒, 大寒
}
while (true)//无限循环模式
{
Terms ts;//声明一个节气的枚举类型变量
Console.WriteLine("请输入字符串数字1-24的正整数查看相应节气");
string jq = Console.ReadLine();
//将输入的字符串转换为相应的枚举并赋值给枚举变量ts
ts = (Terms)Enum.Parse(typeof(Terms), jq);
//使用分支结构switch-case输出相应节气信息
switch (ts)
{
case Terms.立春:
Console.WriteLine("{0}:为每年的2月3-4日", ts);
break;
case Terms.雨水:
Console.WriteLine("{0}:为每年的2月18-19日", ts);
break;
case Terms.惊蛰:
Console.WriteLine("{0}:为每年的3月5-6日", ts);
break;
case Terms.春分:
Console.WriteLine("{0}:为每年的3月20-21日", ts);
break;
case Terms.清明:
Console.WriteLine("{0}:为每年的4月4-6日", ts);
break;
case Terms.谷雨:
Console.WriteLine("{0}:为每年的4月19-20日", ts);
break;
case Terms.立夏:
Console.WriteLine("{0}:为每年的5月5-6日", ts);
break;
case Terms.小满:
Console.WriteLine("{0}:为每年的5月20-22日", ts);
break;
case Terms.芒种:
Console.WriteLine("{0}:为每年的6月5-6日", ts);
break;
case Terms.夏至:
Console.WriteLine("{0}:为每年的6月21-22日", ts);
break;
case Terms.小暑:
Console.WriteLine("{0}:为每年的7月7-8日", ts);
break;
case Terms.大暑:
Console.WriteLine("{0}:为每年的7月22-23日", ts);
break;
case Terms.立秋:
Console.WriteLine("{0}:为每年的8月6-9日", ts);
break;
case Terms.处暑:
Console.WriteLine("{0}:为每年的8月22-24日", ts);
break;
case Terms.白露:
Console.WriteLine("{0}:为每年的9月7-8日", ts);
break;
case Terms.秋分:
Console.WriteLine("{0}:为每年的9月22-24日", ts);
break;
case Terms.寒露:
Console.WriteLine("{0}:为每年的10月7-9日", ts);
break;
case Terms.霜降:
Console.WriteLine("{0}:为每年的10月23-24日", ts);
break;
case Terms.立冬:
Console.WriteLine("{0}:为每年的11月7-8日", ts);
break;
case Terms.小雪:
Console.WriteLine("{0}:为每年的11月22-23日", ts);
break;
case Terms.大雪:
Console.WriteLine("{0}:为每年的12月7-8日", ts);
break;
case Terms.冬至:
Console.WriteLine("{0}:为每年的12月22-23日", ts);
break;
case Terms.小寒:
Console.WriteLine("{0}:为每年的1月5-6日", ts);
break;
case Terms.大寒:
Console.WriteLine("{0}:为每年的1月19-21日", ts);
break;
default:
Console.WriteLine("输入有误");
break;
}
Console.ReadKey();//程序暂停
}
示例2:输入东/西/南/北表示按下键盘相应的键控制游戏角色"行走"
//在命名空间内定义
enum Direction
{
//编程规范:使用英文
东, 西, 南, 北 ////东默认值为 0
}
while (true)
{
Direction dire;//声明一个枚举
Console.WriteLine("输入东西南北字符串表示按下键盘相应的键");
string ori = Console.ReadLine();
//将输入的字符串转换为相应的枚举并赋值给枚举变量dire
dire = (Direction)Enum.Parse(typeof(Direction), ori);
//通过分支结构控制游戏角色"行走"
switch (dire)
{
case Direction.东:
Console.WriteLine("游戏角色向东行走");
break;
case Direction.西:
Console.WriteLine("游戏角色向西行走");
break;
case Direction.南:
Console.WriteLine("游戏角色向南行走");
break;
case Direction.北:
Console.WriteLine("游戏角色向北行走");
break;
default:
Console.WriteLine("输入错误");
break;
}
Console.ReadKey();//程序暂停
}
通过两个示例说明:
1)输入的字符串是枚举中有的枚举成员不会报异常,没有的会报异常
2)输入的是数字字符串,如果在枚举成员类型指定的范围内不会报异常,超出范围的就会报异常
由此印证枚举成员就是枚举成员就是其值的变量名 如示例1中 值为0 变量名就是 东
同一枚举成员间可以比较大小
不同枚举(就是两个自定义类型)即使成员变量名字一样也不能在一起比较大小
拓展:自己编写打印输出月份或星期几等等类似的小程序
要求:分支结构可以通过数值或字符串两种类型选择带有枚举的程序