"|"(单竖线等于)和"&"(单与号等于)是什么意思?

151

以下是代码:

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;


Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;

|=(单管道等于)和&=(单与符号等于)在C#中代表什么意思?

我想要移除系统属性并保留其他属性……

3个回答

207

它们是复合赋值运算符,翻译过来(非常宽泛地说)

x |= y;

进入

x = x | y;

并且对于&也是一样。在某些情况下有更多的细节关于隐式转换,目标变量只被评估一次,但基本上就是这个意思。

在非复合运算符方面,&是按位"AND",|是按位"OR"。

编辑:在这种情况下,您需要 Folder.Attributes &= ~FileAttributes.System。要理解原因:

  • ~FileAttributes.System表示"除了System之外的所有属性"(~是按位NOT)
  • &表示"结果是操作数两侧都出现的所有属性"

所以它基本上是作为一个掩码 - 仅保留那些出现在(“除系统之外的所有东西”)中的属性。一般来说:

  • |=只会向目标添加位
  • &=只会从目标中删除位

2
“x = x | (y);” 是更好的描述方式,因为 “x |= y + z;” 不等同于 “x = x | y + z;”。 - IronMensan
感谢回答。但是针对我的目的(删除系统属性),我应该使用哪一个(|= 还是 &=)? - SilverLight
1
@LostLord:Folder.Attributes &= ~FileAttributes.System; - George Duckett

43

a |= b相当于a = a | b,只是a只被计算一次
a &= b相当于a = a & b,只是a只被计算一次

为了去除系统位而不改变其他位,请使用

Folder.Attributes &= ~FileAttributes.System;

~是按位取反操作符。它会将所有位都设置为1,除了系统位。与掩码进行and运算会将系统位设置为0,并保留其他所有位,因为对于任何x0 & x = 01 & x = x


2
“a” 只被评估一次是什么意思?为什么会被评估多次? - silkfire
@silkfire 这被称为短路评估,请参见https://en.wikipedia.org/wiki/Short-circuit_evaluation。 - Polluks
1
@Polluks,所以基本上a |= b实际上意味着a = a || b - silkfire
@silkfire 是的,但不要混淆一个管道和两个管道。 - Polluks
2
@Polluks:我不理解你关于一条和两条管的评论——我认为使用两条管而不是一条是silkfire在最后一条评论中的全部观点。另外,我不确定语句“除了a只被评估一次”确实指的是短路评估,因为短路评估不会改变第一个操作数( a )的评估,但可能会跳过第二个操作数( b )的评估。 - O. R. Mapper
@silkfire 这意味着一个“非懒惰”的 ||,即表达式的两个部分总是被计算,而标准“懒惰”|| 的第二部分可能不会被计算。 - Evgeni Nabokov

3
我希望能够删除系统属性并保留其他属性。
您可以像这样实现:
Folder.Attributes ^= FileAttributes.System;

1
我认为你应该使用异或(XOR)而不是与(AND)。 - GameZelda
有点困惑 / 是否必要 - SilverLight
@LostLord 据我所知,这两种方法是类似的。 - Chris S
1
@ChrisS ^= bit 如果该位尚未设置,则会设置该位,&= ~bit 则不会设置该位。 - Chronicle
2
你绝对不想使用异或运算。如果已经消失,它会把它放回去。 - John Lord

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接