c#中enum用法,c++中enum
Enum是枚举类型。和struct、int、single、double一样,属于ValueType,从valuetype派生出来,存储在堆栈中。当它被创建时,它不需要分配内部空间,所以它对程序的性能有好处。
为什么要引入enum?一个原因是为了让程序更安全,增加程序的可读性,提高开发效率。
什么时候用?当我们确定了变化的数量和作用后,就可以把变化一个一个的列举出来,然后用enum。
比如有一个图表,可以用三种类型显示,分别是折线图、条形图和饼图。用户可以指定显示方式。这时候我们可以通过变量或者更安全类型的枚举来控制。看啊。
命名空间常量
公共类系统常数
公共常量。Webinfo图表类型{ get设置;}
公共字符串结果;
公共字符串Create()
图表类型=常量。Webinfo . Pie
开关(图表类型)
案例常量。网页信息栏:
Result= bar
//代码语句
//.
//.
打破;
案例常量。网络信息行:
Result= line
打破;
案例常量。Webinfo.Pie:
Result= pie
打破;
返回结果;
公共枚举Webinfo
饼形、条形、线形
}
看,红色的地方是我的枚举。调用时,使用常数。Webinfo.Bar,常量。Webinfo.Line或常量。Webinfo.Pie来调用。类型更安全,不会有错别字。
标志枚举的高级用法:
中标志枚举的使用
问题1
从指定的枚举中移除元素和添加元素,并确定元素集中是否存在元素:
看看代码:
订单状态枚举=订单状态。客户取消订单状态。客户订单订单状态。CustomerQuery//必须是具体的枚举类型,不能直接写枚举类型。
^订单状态。客户已取消;//第一种方法,如果集合中有这个元素,则将其移除,如果没有,则将其添加到集合中。
enums=enums (~OrderState。show border);//第二个方法,移除一个元素
enums=enums OrderState。客户已订购;//将元素添加到枚举列表中
bool hasFlag=((枚举OrderState。客户取消)!=0);//确定指定的枚举元素是否存在于枚举列表中。
控制台。WriteLine(has flag);
问题2:我们将复合枚举集作为int类型存储在数据库中,然后如何将这个int类型值转换成枚举组合?
看看代码:
[旗帜]
公共枚举角色
admini=1,
用户=2,
备份=4,
guest=8,
role enum S2=role . admini role . user role . backup;
enum S2=enum S2 role . guest;//添加元素
enum S2=enum S2 ^ role . guest;//移除元素
控制台。WriteLine((int)enum S2)。ToString());//输出包含的枚举元素的值的总和
int sum=(int)enum S2)//结果是7
//结果RoleSum,method 1,bool aa=enum S2 . has flag(rolename . employee)中是否包含枚举值Role.admin//查看指定的元素
方法二:
if(((角色)枚举。Parse(typeof(Role),RoleSum。ToString()) Role.admin)!=0)//if((Role)Enum。Parse(typeof(Role),RoleSum。ToString())role . admin)==role . admin)
控制台。WriteLine(“包含它”);
其他
控制台。WriteLine(“不包括它”);
方法三:
[旗帜]
公共枚举enumstatus
男=1,
女性=2,
都=4,
enumstatus es
es=enum status . male enum status . female;
if ( (es enumstatus.both)!=0)
控制台。WriteLine( include it s。ToString());
其他
控制台。WriteLine(“不包括它”);
}
问题3如果向枚举集合中添加元素会怎样?我的意思是给一个空的枚举对象添加元素!
role enum S2=role . admini role . user role . backup;//方法一,这是一个静态赋值
Role enum S2=new Role();//方法二,这是先定义一个枚举对象,然后动态的给它添加值。
enum S2=enum S2 role . admini;//也可以这样添加。
enums2 =Role.backup//也可以这样添加。
enums2 =Role.user
问题4:如何将枚举集合转换成字符串数组对象并输出?
///摘要
///要验证的字符串数组枚举集合
////摘要
RoleName enums2=RoleName。管理员角色名。Boss RoleName。HR RoleName。DeptMgr//为角色分配多个值
string[]enum names=null;
enumNames=Regex。Split(enums2。ToString(),,);
if (enumNames。长度1)
{
新异常(“枚举太少!”);
}
其他
{
foreach(枚举名称中的变量名称)
{
控制台。WriteLine(名称);
}
}
标志枚举的一些解释
中的枚举。NET通常有两种用法。一种是表示一个独特的元素序列,比如一周中的每一天;它也用于表示各种复合状态。此时,一般需要用[Flags]将枚举标记为位域,例如:
[flags] enumstyles {showborder=1,//是否显示边框ShowCaption=2,//是否显示标题ShowToolbox=4 //是否显示工具箱}
这样,我们可以用“or”运算符组合多个状态,例如:
我的控制。风格=风格。显示边框样式。显示标题;
此时,myControl的值。样式枚举将变为1 ^ 2=3,其ToString()将变为“styles.showborder,styles.showcaption”。
这里我们可以解释为什么第三个值ShowToolbox可以是4,5.而不是3。也就是说,它的值不应该是前面值的合成值。有一个简单的方法,用2的n次方依次给每一项赋值,比如1,2,4,8,16,32,64。
现在,让我们看一个常见的Flags应用程序示例。例如,一个简单的权限系统有两个角色:“管理员”和“用户”。我们可以在表中放置一个varchar()字段,以文本形式存储权限词“Admin,User”。但是有了标志枚举,我们可以直接把角色的值。管理员角色。int字段中的用户。
以下是一些关于枚举的常见操作:
将枚举的值改回枚举对象:
样式style=(Styles)枚举。Parse(typeof(Styles),“4”);//- style=样式。工具箱;
检查枚举是否包含元素:
bool hasFlag=((style样式。ShowBorder)!=0);
事实上,我们会遇到这样的情况,我们需要从组合状态中移除一个元素。您可以使用“”运算符来完成此操作:
样式样式=样式。显示边框样式。显示标题;^风格。ShowBorder
这个时候,风格的价值就变成了风格。显示标题
但是这里有一个严重的问题(我现在才发现)。
这次我们会再做一次。
^风格。ShowBorder
按照我们的假设,此时风格的价值就是风格。ShowCaption,它不包含样式。因此,即使我们删除了这个元素,样式仍然应该保持不变。但是实际的样式值已经改成了styles . show border styles . show caption!再执行一次,这个元素又会被去掉,周而复始。
当然,我们可以在移除一个元素之前进行检查。如果枚举包含此元素,请再次移除它:
if((样式样式。ShowBorder)!=0){ style=style ^样式。ShowBorder}
我想知道是否有其他方法可以方便地从Flags枚举状态中移除一个元素。
感谢mobilebilly:
Style=style (~Styles。ShowBorder)可以方便地删除元素。
善用枚举
这几天我手里有一个关于订单的项目。订单通常有状态。以前我习惯只想到几种订单,我就直接写下来。很浪费资源,但是写下一个数字来代表一个订单状态也很浪费资源,所以我要记住数字代码是什么,编码的时候是什么状态。如果我不小心写错了,就会导致数据错误。
后来,我觉得。NET有一个枚举。这么好的东西为什么不用?这样不仅方便了以后的代码维护,也方便了编码。
公共枚举订单状态
/**////摘要
///无效状态
////摘要
无效=0,
/**////摘要
///客户查询
////摘要
客户查询=1,
/**////摘要
///客户一个人。
////摘要
客户订单=2,
/**////摘要
///客户付费
////摘要
ReceiverCustomerPayment=4,
/**////摘要
///从供应商处订购
////摘要
供应商排序=8,
/**////摘要
///供应商确认交货日期
////摘要
SupplierOrderTerm=16,
/**////摘要
///收到货品
////摘要
RecieverGoods=32,
/**////摘要
///客户取消订单
////摘要
CustomerCanceled=64,
/**////摘要
///供货商取消订单
////摘要
SupplierCancelded=128
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。