首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【小雨学编程之C#】18.5 枚举

在我们编程过程中经常会遇到这样的问题:

比如在编写人员管理程序中,有个区分性别的功能,要求我们对员工的性别进行入库管理。

比如地图应用中,需要有个区分相对位置的功能,要求我们知道具体的位置。

对于以上两个功能,我们通常的想法是,对于性别,我们定义两个变量:

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("当前学生的姓名,年龄,性别", _name, _age, _gender);

Console.ReadKey();

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210331A0E5A700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券