zoukankan
html css js c++ java
FlagsAttribute属性在enum中的应用
FlagsAttribute属性在enum中的应用
我看了Effective C#一书中的Item
8
: Ensure That
0
Is a Valid State
for
Value Types时提到了Flags属性在enum中的应用,于是就查了一下资料,写了一点关于这个的体会
.Net C#中枚举的声明格式如下所示:
[attributes] [modifiers]
enum
identifier [:
base
-
type]
{enumerator
-
list}
[;]
FlagsAttribute属性就是枚举类型的一项可选属性。它的主要作用是可以将枚举作为位域处理(P.S. C#不支持位域)。所谓位域是单个存储单元内相邻二进制位的集合。通过为枚举添加这个属性,可以改变枚举的一些行为来满足我们的需要。
我们声明这样一个枚举,并执行如下语句:
enum
MyFlags
{ Flag1, Flag2, Flag3, Flag4}
;
MyFlags myFlag
=
MyFlags.Flag2
|
MyFlags.Flag3;
Console.WriteLine(myFlag);
得到的结果是:
Flag4
因为对于整数来说,
|
操作就是将其转化为二进制再进行或运算。Flags.Flag2
|
Flags.Flag3做的工作实际上是
0001
|
0010
=
0011
=
3再转换成(MyFlags)3就是Flag4了
而如果将枚举声明为:
[FlagsAttribute]
enum
MyFlags
{
Flag1
=
0
,
//
000
Flag2
=
1
,
//
001
Flag3
=
2
,
//
010
Flag4
=
4
//
100
}
;
则上述程序的结果为:
Flag2,Flag3
这样做的意义在于我们可以实现“或”的关系
就上例而言,myFlag可以更直观的表现为011,因此当我们想要检验它满足哪个枚举值时我们可以使用
&
操作
if
((myFlag
&
MyFlags.Flag2)
==
MyFlags.Flag2)
{
Console.WriteLine(
"
true
"
);
}
if
((myFlag
&
MyFlags.Flag3)
==
MyFlags.Flag3)
{
Console.WriteLine(
"
true
"
);
}
011
&
001
=
001
,
011
&
010
=
010
,因此这两个if都会成立,这就是这种枚举的意义吧。另外我们应当注意默认初始化的myFlag的值为0,与其作
&
运算不会有任何结果。
查看全文
相关阅读:
eclipse web项目转maven项目
spark作业
大数据学习——spark-steaming学习
大数据学习——sparkSql对接hive
大数据学习——sparkSql对接mysql
大数据学习——sparkSql
大数据学习——spark运营案例
大数据学习——spark笔记
大数据学习——sparkRDD
python面试题
原文地址:https://www.cnblogs.com/RuiLei/p/664261.html
最新文章
Go语言入门——interface
Go语言入门——数组、切片和映射(下)
Go语言入门——数组、切片和映射
2018的穿肠毒药和2019的心灵鸡汤
前端与后端分离的架构实例(一)
一个示例让你明白界面与数据分离
迟来的2013年度总结
WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务
WCF Data Service 使用小结 (一)—— 了解OData协议
《深入了解 Linq to SQL》之对象的增删改 —— 麦叔叔呕心呖血之作
热门文章
osgUtil::PolygonIntersector多面体与模型求交
osg中使用geometry shader方式
glsl线框网格模式wireframe
glsl sampler2D相关使用方法
Qt组件(例如按钮、树形控件)上响应鼠标右键
带有Q_OBJECT的类要放在头文件的第一个类位置,否则可能无法moc
QWidget添加带有图片的QPushButton,布局QGridLayout
MainWindow最小化之后再最大化UI假死
Qt 一张图片显示在其他组件之上
片段非线性深度值变换为线性
Copyright © 2011-2022 走看看