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

时间:2015-09-07 09:24:25

标签: c# .net bitmask

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

if ((attributes & FileAttributes.Hidden) == FileAttributes.Hidden)

但我不明白为什么就是这样。

为什么attributes & FileAttributes.Hidden)?对attributes的单一检查实际上做了什么?它是否检查它是否为空?我有一种感觉,但我觉得很奇怪。随机而怪异。

3 个答案:

答案 0 :(得分:15)

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

真:

  0010001 // attributes
& 0000001 // FileAttributes.Hidden
  -------
= 0000001 // FileAttributes.Hidden

假:

  0011000 // attributes
& 0000001 // FileAttributes.Hidden
  -------
= 0000000 // FileAttributes.None

答案 1 :(得分:4)

attributes属于FileAttributes类型。此类型是enum,值类型。它不是FileAttributes?Nullable<FileAttributes>),因此它只是不能为空

每个enum都包含一个命名值列表,但每个值都可以映射/转换为某些整数(int)值。在许多地方,C#允许你“开发”#34;转换和(有些)将枚举值视为它们是整数,但它们仍然不是。

例如,&amp;运算符执行您期望的 - 它执行二进制AND。这样,如果转换为整数的枚举值设置了相关的位,则会得到一些非零结果。

以一种古老的方式&#34;检查某些状态值中是否存在某些标志/位。您可能经常会看到foo & FLAG != 0这样的表达式来检查是否设置了标志,或foo & (FLAG|BLAG) != 0检查是否设置了这两个中的任何一个。这有点有缺陷/危险,因为如果有人将FLAG改为多于一位,那么这样的表达式将检查是否设置了任何位,而不是整个这样的&#34;多位标志&#34;已设定。这就是为什么你经常会看到foo & FLAG == FLAG应用位掩码并检查结果是否为位掩码的原因,因此会检查掩码的所有位是否都已设置。

在这种情况下,就是这样。因为在该表达式中,您使用相同的掩码进行AND运算和比较,所以您有效地检查是否设置了掩码的所有位。但由于FileAttributes明确标记为[Flags],因此Hidden值只有一位,所以!= 0就足够了。

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

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

..但如果性能成本对您来说是一个问题我会感到惊讶。很少需要优化到这一点。

答案 2 :(得分:3)

&安培;是一个按位和操作员。

此运算符只执行按位AND和2组位。

0 & 0 === 0
1 & 0 === 0
0 & 1 === 0
1 & 1 === 1

在&运算符旁边,还存在OR(|)和XOR(异或)(^)运算符。