在C#中使用|=运算符时会发生什么?
如果我用的是这样的东西:在C#中使用|=运算符时会发生什么?,c#,.net,operators,assignment-operator,C#,.net,Operators,Assignment Operator,如果我用的是这样的东西: xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; =“code>完成了什么?在本例中,您正在设置XmlSchemaValidationFlags.ReportValidationWarnings标志 |=通常是按位或运算符,如果是标志,则用于设置标志。|=是将两个值相加或将结果赋给第一个变量的快捷方式 xr.Settings.ValidationFlags
xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
=“code>完成了什么?在本例中,您正在设置XmlSchemaValidationFlags.ReportValidationWarnings
标志
|=
通常是按位或
运算符,如果是标志
,则用于设置标志。|=
是将两个值相加或将结果赋给第一个变量的快捷方式
xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
相当于:
xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;
|
是C#中的OR运算符,因此上面的代码有效地在值xr.Settings.ValidationFlags
上设置了ReportValidationWarnings
标志,这是布尔值或相等值
相当于:
xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;
确保设置了XmlSchemaValidationFlags.ReportValidationWarnings
中的位。这是一个复合赋值。基本上你在做:
xr.Settings.ValidationFlags =
xr.Settings.ValidationFlags |
XmlSchemaValidationFlags.ReportValidationWarnings;
这将本质上向xr.Settings.ValidationFlags
中包含的标志集添加XmlSchemaValidationFlags.ReportValidationWarnings
,正如其他人所提到的,a |=b是a=a | b的简写,与a+=b是a=a+b的缩写方式大致相同。
现在|操作符做什么?它可以重载,但它的一般用法是按位或按位使用。它类似于| |运算符,但它是逐位工作的(将每一位都视为布尔值):
假| |真是真
0100 | 0110是0111
最后一件事是传递一组布尔标志的经典方法之一是将它们编码为整数。单个32位整数可以包含32个单独的标志,每位一个。要设置标志,请将相应的位设置为1
因此0000没有设置标志,而1001在位置1和4设置了标志
然后|=是设置特定标志的方便方法
int my_flags=0
my|u flag |=验证|u flag 是正确的
|=
与在条件测试中使用|
操作符相同,如下例所示:
xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings
在语义上与
xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings
关于|
与|
我发现另一个有用的小贴士是(|
)和(|
)之间的区别:
逻辑OR将始终计算两个操作数,即使第一个操作数为true
。如果第一个操作数为false
,条件OR将只计算第二个操作数,如果不需要执行第二个操作数来确定最终结果,则条件OR将有效地短路。那么,它为什么要这样做呢?我很难理解这个操作。赋值运算符之后的比较实际上是如何发生的?我知道这是在比较数据,但我有点难以理解。这根本不是在比较数据。如果您有两个字节1001101
,并且您使用1100 1011
将其设置为1101111
。如果在任一操作数中设置一位,则在结果中设置该位。|=
的简写形式只表示或
的左操作数是|=
左侧的操作数。下面的链接不表示正在进行按位比较吗。我想我的困惑是这样的:bool b=true;b |=假代码>但b仍然返回true。我觉得自己很愚蠢,但我不明白这会转化为上面发生的事情。
的意思是或;如果任一参数为真,则结果为真。在这种情况下,它是按位的或
,这意味着如果任一参数中的任何位为1,它将保持为1。