首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果((attributes& FileAttributes.Hidden) == FileAttributes.Hidden) {}如何工作?

如果((attributes& FileAttributes.Hidden) == FileAttributes.Hidden) {}如何工作?
EN

Stack Overflow用户
提问于 2015-09-07 09:24:25
回答 3查看 1.3K关注 0票数 7

页面上,我看到以下代码:

代码语言:javascript
复制
if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)

但我不明白为什么会这样。

为什么是attributes & FileAttributes.Hidden)attributes上的单数检查实际上是做什么的?它是否检查它是否为空?我有种预感,但这似乎很奇怪。随机而怪异。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-07 09:32:22

这是简单的布尔逻辑。==运算符仅在双方具有完全相同的值时才返回true。因此,您必须使用要与之比较的标志来掩蔽attributes值。考虑这两个例子(由值组成):

真:

代码语言:javascript
复制
  0010001 // attributes
& 0000001 // FileAttributes.Hidden
  -------
= 0000001 // FileAttributes.Hidden

假:

代码语言:javascript
复制
  0011000 // attributes
& 0000001 // FileAttributes.Hidden
  -------
= 0000000 // FileAttributes.None
票数 16
EN

Stack Overflow用户

发布于 2015-09-07 09:39:32

attributesFileAttributes型的。此类型是enum,值类型。它不是FileAttributes? (Nullable<FileAttributes>),因此简单地说,不能是空

每个enum都包含一个命名值列表,但每个值都可以映射/转换为某个整数(int)值。在许多地方,C#允许您“利用”该转换,并(在某种程度上)将枚举值视为In,但它们仍然不是。

例如,&操作符执行您期望的操作-它执行二进制和。这样,如果转换为整数的枚举值具有相关的位(S)设置,您将得到一些非零的结果。

用“好的旧方式”检查某些标志/位是否在某种状态值中存在。您可能经常看到像foo & FLAG != 0这样的表达式,它检查是否设置了标志,或者foo & (FLAG|BLAG) != 0检查是否设置了这两个标记。这是有一点缺陷/危险的,因为如果有人改变标志有多个位,那么这样的表达式会检查是否设置了任何位,而不是整个这样的“多位标志”是否被设置。这就是为什么您还经常看到foo & FLAG == FLAG应用位掩码并检查结果是否是位掩码,所以它检查是否设置了所有的掩码位。

在你的情况下就是这样。因为在该表达式中,您是ANDing,并且与相同的掩码相比,您可以有效地检查是否设置了掩码的所有位。但是这是多余的,因为FileAttributes显然被标记为标志,Hidden值只有一个位,所以!= 0就足够了。

但是,在这种情况下(检查标志,而不是花哨的位掩码)您可以尝试使用Enum.HasFlag方法,大多数人会建议您使用它,因为它是针对这种情况而设计的;)

然而,这并不总是最好的选择。请参阅:

  • http://www.codeproject.com/Tips/441086/NETs-Enum-HasFlag-and-performance-costs
  • http://www.dotnetbitsandpieces.com/?p=11

如果..but的性能成本对你来说是个问题的话,我会被告知的。对此进行优化是非常不需要的。

票数 4
EN

Stack Overflow用户

发布于 2015-09-07 09:35:57

&是一个按位操作的操作符。

这个运算符只按位执行一个位数和2组位。

代码语言:javascript
复制
0 & 0 === 0
1 & 0 === 0
0 & 1 === 0
1 & 1 === 1

除了and运算符之外,还存在一个OR (\)和XOR (独占OR) (^)运算符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32435230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档