请问如何检测类型为位域的enum变量内容?

屡败屡战数马援 2006-11-25 02:00:59
看了MSDN,也在网上找了,都没有发现有效的办法。

一个enum类型如下

using System;

[Flags]
public enum Operation
{
Nothing = 0x0,
DoSomething1 = 0x1,
DoSomething2 = 0x2,
DoSomething3 = 0x4,
DoSomething4 = 0x8,
}

那么,一个已经赋值的枚举变量,如何判断它含有哪些枚举值?
如:

Operation op = Operation.DoSomething2 | Operation.DoSomething3 | Operation.DoSomething4;

那么,当前变量 op 有三个枚举内容,请问如何在代码中检测出?
...全文
218 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
james_hunter 2006-11-25
  • 打赏
  • 举报
回复
应该这样设计:
public enum Operation
{
Nothing = 0x0,
DoSomething1 = 0x1,
DoSomething2 = 0x2,
Do1And2 = 0x3,
DoSomething3 = 0x4,
Do1And3 = 0x5,
Do2And3 = 0x6,
Do1And2And3 = 0x7,
DoSomething4 = 0x8,
}
不过,实际上,如果太多东西的话,不建议设计成枚举变量,因为最后不好命名。
Ivony 2006-11-25
  • 打赏
  • 举报
回复
所有的判断,结果只有真和假两种,你想进行何种判断?
runrunrun 2006-11-25
  • 打赏
  • 举报
回复
一个一个检测

if( (op & Operation.DoSomething1) != 0 )
if( (op & Operation.DoSomething2) != 0 )
if( (op & Operation.DoSomething3) != 0 )
if( (op & Operation.DoSomething4) != 0 )
  • 打赏
  • 举报
回复
@ Ivony() :
我说的意思是我在做一个Console类型项目,这个Operation枚举对应的是这个项目的参数。
项目使用参数来控制要操作的行为。

那么首先检查参数后生成一个类型为Operation的枚举变量,然后传递到专门的执行操作的类实例中操作。

但是我无法确定要执行哪些操作,操作总共有十几种,可能是全部这十几种都操作,也有可能其中一部分,或者单项操作。那么负责执行操作的类必须要检测这个Operation类型所包含的项。
所以才提出这个问题。
Ivony 2006-11-25
  • 打赏
  • 举报
回复
没看明白……
op == Operation.DoSomething2 | Operation.DoSomething3 | Operation.DoSomething4
不行么?
ivorstar 2006-11-25
  • 打赏
  • 举报
回复
要检测出三个值作什么用呢?

op.toString("F")就能列出这三个值。内部实现也是一位一位的去匹配,应该也没什么更好的办法了。我觉得一般bit flag只是用来检查确定的某几位是否为真,(op & Operation.DoSomething2) != 0就够了,即使检测出op包含了哪些位,也很难用它去控制程序逻辑啊
llyzcy 2006-11-25
  • 打赏
  • 举报
回复
up
阿牛138588 2006-11-25
  • 打赏
  • 举报
回复
值相加得到特定的结果表示含有特定的值,这也是为什么值会是1+n(n-1)次方
yinliaobao 2006-11-25
  • 打赏
  • 举报
回复
C语言各种常用关键字详细解释学习,都是总结面试,都是比较好的笔试题。 1 变量 3 1.1 全局变量,局部变量,,常量分别保存在内存中的什么地方? 3 1.2 不同类型变量,你是否知道其作用域? 3 1.3 全局变量和局部变量是否可以重名?你是否在这样做? 3 1.4 局部变量在函数退出后是否有效,为什么? 3 1.5 全局变量为什么不允许定义在头文件中?有何危害? 3 2 Static 4 2.1 static的三个主要作用是什么? 4 2.2 static的修饰的局部变量是保存在什么地方的?全局变量哪? 5 2.3 static修饰的全局变量和函数,在其他的文件中是否可以访问?如何访问? 5 2.4 你知道static是c语言中实现封装和隐藏的利器吗?你是否经常使用? 5 2.5 定义在不同源文件中的static全局变量,编译器是否允许他们的变量名称相同? 5 2.6 你是否知道auto、extern、register、volatile、restrict、inline的用法? 6 3 const 6 3.1 你是否经常使用const来表明不能够被更改的变量? 6 3.2 你是否经常使用const常量来代替宏? 6 3.3 下面四种情况,你知道是各表示什么意思吗? 6 3.4 你知道const常量如何初始化吗? 7 4 enum枚举 7 4.1 到底enum所定义出来的类型是一个什么样的类型呢? 7 4.2 作为一个用户自定义的类型其所占用的内存空间是多少呢? 8 4.3 是否可以指定枚举中各项的值? 8 4.4 如果不指定值,枚举的第一个值是多少? 8 4.5 枚举的值是否可以是负数? 8 4.6 定义枚举的时候,你是否专门定义了枚举的最小值和最大值? 9 5 switch 9 5.1 switch(c)中的c的数据类型有哪些? 9 5.2 你是否在所有的switch中都加了default语句? 9 5.3 是否在所有的case中都加了break语句(一般情况的做法)?如果你不加break,将会发生什么? 9 6 sizeof 9 6.1 对于字符数组,strlen和sizeof的值是否相同? 9 6.2 Sizeof本质上是什么?函数?宏?其他? 9 6.3 Sizeof的返回值是什么类型? 10 7 动态分配内存 10 7.1 动态分配的内存是保存在什么地方的? 10 7.2 什么情况下使用动态分配内存? 10 7.3 动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具? 10 8 字符串 10 8.1 strlen()函数的返回值是什么类型的? 10 8.2 字符串strlen() 的值,是否和他占据的内存空间相同? 10 8.3 你是否知道strcpy 函数存在的潜在风险?如何避免? 11 8.4 如果一个字符串没有字符串结束符,而调用str 开头的库函数,会发生什么? ?? 11 8.5 Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的?这些函数到底对源字符串和目标字符串做了些什么?你是否观察过它们运行时两个字符串内存的变化? 11 8.6 上面这些函数使用时,各有哪些需要注意的地方? 11 8.7 你会几种字符串查找操作? 11 8.8 C语言中有字符串这个数据类型吗? 11 8.9 对字符串进行操作的时候,是否为字符串结尾符预留存储位置?不然的话容易造成非常访问内存。 11 9 数组 12 9.1 你肯定知道,定义“int a[10]; ”, a[10] 这个元素是无效的。 12 9.2 你知道几种数组初始化的方法? 12 9.3 数组和指针有千丝万缕的联系而又不同,你是否对他们在不同情况下的使用进行过详细的总结? 12 9.4 “int calendar[10][20]; ”,这是一个什么样的数组?它拥有 10 数组类型的元素,还是 20 个? 12 9.5 “int a[10]; ”,数组名 a 在本质上是一个什么?你是否打印过 a 的值? 12 9.6 你知道几种获取数组某元素的方法? 12 9.7 指针和数组相同吗?什么时候相同?什么时候不同? 12 9.8 用指针和下标访问数组元素,那种方式更快? 16 10 结构体 16 10.1 你知道什么是位域结构体吗?如何定义它?如何使用它? 16 10.2 你知道字节对齐对结构体占用内存空间大小的影响吗?如何计算结构体占用内存的小? 17 11 宏 19 11.1 你知道宏的本质是什么吗?函数?语句?类型定义?或者其他? 19 11.2 你知道语言设计者为什么设计宏吗?这些原因目前是否仍然成立? 19 11.3 你会设计带有参数的宏吗? 19 11.4 你知道使用宏的参数的的时候的注意事项吗? 19 11.5 你会设计带有可变参数的宏吗? 19 11.6 你知道使用宏有什么劣势吗? 20 11.7 你有没有更好的替代方案? 20 11.8 为什么说宏定义不好? 21 12 如何避免对同一头文件的多次include? 22 13 什么是声明,什么是定义? 22 14 你是否会运用c语言声明的优先级规则? 23 15 什么是预编译,何时需要预编译? 23 Total time: 90 minutes 23 16 指针数组和数组指针的区别? 30 16.1 指针的声明 30 16.1.1 一维数组 31 16.1.2 多维数组 32 16.1.3 指针数组 33 16.1.4 指针的指针 33

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧