在我们编程过程中经常会遇到这样的问题:
比如在编写人员管理程序中,有个区分性别的功能,要求我们对员工的性别进行入库管理。
比如地图应用中,需要有个区分相对位置的功能,要求我们知道具体的位置。
对于以上两个功能,我们通常的想法是,对于性别,我们定义两个变量:
string male;
string female;
用以代表性别
对于位置我们定义4个变量:
string east;
string south;
string west;
string north;
用以代表四个方向
但是在实际应用过程中我们发现,如果我们这样的定义使用,只有我们自己知道对应变量代表的含义。并且对应变量是零散的不容易管理。
通过我们仔细的观察发现,这样的应用都有一个共同的特点,需要的内容是一个概念或者一件事情,只是这件事情包括了几种固定的状态。
比如我们需要的性别是一件事情,这件事情中只有两种状态,要么是男,要么是女。
我们需要的方向也是一件事情,只是这件事情中包括东、西、南、北四个状态。
也就是我们需要一种同时包含几种状态的数据形式。
这时C#提供了枚举这个复杂数据类型来处理这样的数据要求。
语法:
访问修饰符 enum 枚举名{
枚举成员1,枚举成员2
}
比如,我们用枚举定义性别
public enum gender{
male,
female
}
这里的访问修饰符public暂时不用管它具体的意思,我们暂时这样使用,后面会有专门的篇幅进行介绍。
此时我们需要注意的是,枚举类型声明的位置
它声明于我们经常使用的Main外面,Program里面,从层级结构上看去好像枚举和main是同一个级别的。
但是实质上应当是定义在类里面,和函数同级,只是类和函数这样的概念我们之后会有专门的篇幅来介绍。
那我们怎么使用它呢?
语法:枚举名.成员名
我们会看到,当直接使用枚举成员的时候,成员名字会以字符串的形式直接输出。
因为这个枚举类型是我们定义出来的一种数据类型,我们就可以像声明int和string一样来声明它,语法:
枚举名 变量名=枚举.成员名
这时我们看到,枚举类型解决了我们之前总结的数据要求,一件事情,包括几种不同的状态。
就如同性别有男和女两个状态,方向有东、西、南、北四个方向一样。
这时我们可以作一个小例子,由用户输入学生姓名、年龄、性别,由计算机存储并输出。
要想完成这个例子,我们首先解决,怎样判断用户输入了哪个一枚举成员:
于是我们想到用switch来判断用户输入:
但是这时却发生了编译错误,这里我们也没有转换为string的需求呀?咱们枚举调用过程中,不就是输出的字符串嘛?
这时候就需要大家注意一个细节,我们上文中提到过,声明一个枚举类型变量是这样的: gender a = gender.male;
这里需要注意的是,我们声明的变量的类型是枚举类型名gender并不是string,也就是说,我们输出gender.male得到的male并不是输出的字符串,只是将这个枚举类型名字输出出来了,那么到底这个枚举成员的数据类型是啥呢?
我们知道枚举是个复杂数据类型,也就是一些规则加上简单数据类型之和。那么我们的枚举成员的默认数据类型是int,比如我们实验:
通过这个测试我们看出,其实依照枚举成员声明的顺序,系统自动按照0、1、2……对枚举成员进行赋值,所以当我们要使用枚举成员的时候,依照具体需求需要对对应的枚举成员进行强制类型转换。
现在,我们知道male的值是0,female的值是1,那么我们就可以通过给用户选择的方式,实现用户输入性别,比如:
如果我们想做到,如果用户输入,提示输入错误,直到用户输入正确为止,我们可以这样:
这样,这个难点我们就解决了,接下来就是通过已知的知识点来完成上述例子:
Console.Write("请输入学生姓名:");
string _name = Console.ReadLine();
Console.Write("请输入学生年龄:");
string _s_age = Console.ReadLine();
int _age = Convert.ToInt32(_s_age);
string _gender = "";
bool _out = true;
do
{
Console.Write("请选择学生性别 0->男|1->女:");
string _input = Console.ReadLine();
switch (Convert.ToInt32(_input))
{
case (int)gender.male:
_gender = "男";
_out = false;
break;
case (int)gender.female:
_gender = "女";
_out = false;
break;
default:
Console.WriteLine("性别输入错误!");
break;
}
} while (_out);
Console.WriteLine("当前学生的姓名{0},年龄{1},性别{2}", _name, _age, _gender);
Console.ReadKey();