请问位域枚举在C#中就是这样使用的吗?

zhiang75 2005-05-10 05:27:27
定义了一个位域枚举
[Flags]
public enum DocTreeRootShow
{
None=0,
UserWork=2,
ROOT_Document=4,
ROOT_数据字典=6,
ROOT_User=8,
ROOT_审批模板=32,
ALL=UserWork|ROOT_User|ROOT_Document|ROOT_数据字典|ROOT_审批模板,

}

比较枚举这样的语法不行
DocTreeRootShow test=DocTreeRootShow.ALL
if(test==DocTreeRootShow.UserWork)
{
//永远不会返回真.
}

要这样写才可以

if((test&DocTreeRootShow.UserWork)!=DocTreeRootShow.None)
{
//这样才可以
}


[Flags]关键字没有任何用处,就是去掉也是可以正常执行的,
[Flags]说是支持位域枚举,难道我的用法有问题?
请高手指点.



...全文
197 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
9sun888 2005-05-12
  • 打赏
  • 举报
回复
if((test&DocTreeRootShow.UserWork)==DocTreeRootShow.UserWork)
{
//这样才可以
}
这样写:就是说test中是否包含DocTreeRootShow.UserWork枚举值?

又比如:
如果你定义:DocTreeRootShow test=DocTreeRootShow.ROOT_审批模板
那么执行(test&DocTreeRootShow.UserWork)==DocTreeRootShow.UserWork判断时,将返回false,说明test中不包含DocTreeRootShow.UserWork枚举值

再比如:
你再定义了一个枚举:ROOT_test=UserWork|ROOT_数据字典|ROOT_审批模板
执行语句如下:
DocTreeRootShow test=DocTreeRootShow.ROOT_test
那么执行(test&DocTreeRootShow.UserWork)==DocTreeRootShow.UserWork判断时,将返回true,说明test中包含DocTreeRootShow.UserWork枚举值


zhiang75 2005-05-12
  • 打赏
  • 举报
回复
if((test&DocTreeRootShow.UserWork)!=DocTreeRootShow.None)
{
//这样才可以
}

if((test&DocTreeRootShow.UserWork)==DocTreeRootShow.UserWork)
{
//这样才可以
}

只是一个问题的两种表现形式

To:Jamestan(阶梯)
感谢你的细心,这个问题我在2楼已经更正了

再次UP..
明天结贴


xjp0000 2005-05-12
  • 打赏
  • 举报
回复
看不出有区别
Jamestan 2005-05-11
  • 打赏
  • 举报
回复
顺带说一下:
None=0,
UserWork=2,
ROOT_Document=4,
ROOT_数据字典=6,
ROOT_User=8,
ROOT_审批模板=32,
ALL=UserWork|ROOT_User|ROOT_Document|ROOT_数据字典|ROOT_审批模板,

这样设置权值是错误的,应该是:
None=0,
UserWork=2,
ROOT_Document=4,
ROOT_数据字典=8,
ROOT_User=16,
ROOT_审批模板=32,
ALL=UserWork|ROOT_User|ROOT_Document|ROOT_数据字典|ROOT_审批模板,
Jamestan 2005-05-11
  • 打赏
  • 举报
回复
楼上正解!

既然是比较位,当然先要跟权值位做"与"操作才能判断。

你感觉位运算不方便是因为C#跟C不一样,不能将int转换为bool值,所以看起来这个位运算不是很方便而已,在C里面是可以直接按位求“与”来判断的。
9sun888 2005-05-11
  • 打赏
  • 举报
回复
[Flags]还是有作用的,位域可以使用按位“或”运算进行组合,而枚举常数不行.
9sun888 2005-05-11
  • 打赏
  • 举报
回复
应该这么写:
if((test&DocTreeRootShow.UserWork)==DocTreeRootShow.UserWork)
{
//这样才可以
}
zhiang75 2005-05-11
  • 打赏
  • 举报
回复
up...
zhiang75 2005-05-11
  • 打赏
  • 举报
回复
up
zhiang75 2005-05-10
  • 打赏
  • 举报
回复
抱歉,枚举应该是
[Flags]
public enum DocTreeRootShow
{
None=0,
UserWork=2,
ROOT_Document=4,
ROOT_数据字典=8,
ROOT_User=16,
ROOT_审批模板=32,
ALL=UserWork|ROOT_User|ROOT_Document|ROOT_数据字典|ROOT_审批模板,

}

110,545

社区成员

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

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

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