| =(单管道等于)和&=(单与号等于)是什么意思


115

在下面的行中:

//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#中,|=(单个管道相等)和&=(单个与号相等)是什么意思,
我想删除系统属性并保留其他属性...

Answers:


149

他们是复合赋值运算符,(非常松散地)翻译

x |= y;

进入

x = x | y;

和相同的 &。在某些情况下,关于隐式强制转换还有更多详细信息,并且目标变量仅被评估一次,但这基本上就是要点。

就非复合运算符而言,&是按位“ AND”|按位“ OR”

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

  • ~FileAttributes.System表示“ System以外的所有属性(~按位表示)
  • & 表示“结果是出现在操作数两侧的所有属性”

因此,它基本上起着掩码的作用- 保留出现在其中的属性(“除系统外的所有内容”)。一般来说:

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

2
x = x | (y);是一种更好的描述方式,因为x |= y + z;x = x | y + z;
IronMensan 2011年

感谢您的回答/但出于我的目的(删除系统属性),我应该使用哪一个(| =或&=)?
SilverLight

1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett

33

a |= b等效于,a = a | b除了a仅被评估一次
a &= b,等效于a = a & b除外,a仅被评估一次

为了删除系统位而不更改其他位,请使用

Folder.Attributes &= ~FileAttributes.System;

~是按位取反。因此,将系统位以外的所有位设置为1。and与面罩-ing将系统设置为0,并将所有其他位不变,因为0 & x = 01 & x = x任何x


1
a仅被评估一次意味着什么?为什么要对它进行更多次评估?
Silkfire '18

@silkfire这称为短路评估,请参见en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks

@Polluks所以a |= b实际上实际上是a = a || b什么意思?
Silkfire

@silkfire是的,但是不要互换一个管道和两个管道。
Polluks

3

我想删除系统属性并保留其他属性。

您可以这样做:

Folder.Attributes ^= FileAttributes.System;

1
我想您想为此使用XOR而不是AND。
GameZelda 2011年

有点困惑/〜是否必要
SilverLight

据我所知,这两种方法是相似的
Chris

@ChrisS ^= bit将设置该位(如果尚未设置),&= ~bit则不设置。
编年史

您绝对不想使用异或。如果它消失了,那将把它放回原处。
John Lord
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.