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,与其作
&
运算不会有任何结果。
查看全文
相关阅读:
django 项目需要注意的一些点
VUE之路
Oracle 表格碎片的查看方法
RHEL 6.x or 7.x 使用分区绑定ASM 磁盘的方法
RMAN 修复主库 nologging 操作导致物理备库的坏块
Oracle 数据库19c 回退降级到 11.2.0.4 方案
如何评估oracle 数据库rman全备和增量备份大小
在将Oracle GI和DB升级到19c或降级到以前的版本之前需要应用的补丁 (Doc ID 2668071.1)
Oracle 数据库坏块处理
opatch auto 安装11.2.0.4.20190115 PSU遇到 OUI-67133: Execution of PRE script failed,with returen value 1 报错
原文地址:https://www.cnblogs.com/RuiLei/p/664261.html
最新文章
使用idea创建控制台项目
C#线程同步AutoResetEvent类介绍
JAVA8_STREAM
Jdk1.8中的循环链
聊聊OSGI
面试知识点
JVM的锁优化
类加载机制
常用数据结构总结
Redis集群搭建
热门文章
Java基础——多线程
MySql索引
通过jekyll在Github 搭建个人博客
Django之路12——form modelform formset modelformset的各种用法
Django REST framework —— 权限组件源码分析
Django REST framework —— 认证组件源码分析
JQuery DOM操作(属性操作/样式操作/文档过滤)
Django之路——11 Django用户认证组件 auth
用Python玩转微信
虚拟环境的配置
Copyright © 2011-2022 走看看