在 C# 中使用 |= 运算符时会发生啥?

Posted

技术标签:

【中文标题】在 C# 中使用 |= 运算符时会发生啥?【英文标题】:What is happening when you use the |= operator in C#?在 C# 中使用 |= 运算符时会发生什么? 【发布时间】:2012-12-07 03:50:12 【问题描述】:

如果我使用这样的东西:

xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

|= 到底在做什么?

【问题讨论】:

【参考方案1】:

driis' answer 是正确的。

|= 与在条件测试中使用 | 运算符相同,如下例所示:

xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings

在语义上与

相同
xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings

关于 ||| 的附加说明

我发现另一个有用的花絮是logical OR (|) 和 conditional OR (||) 之间的区别:

逻辑 OR 将始终计算两个操作数,即使第一个是 true。条件 OR 只会在第一个是 false 时评估第二个,如果不需要执行第二个操作数来确定最终结果,则有效地短路。

【讨论】:

【参考方案2】:

正如其他人所提到的,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_flag |= validate_flag;

【讨论】:

【参考方案3】:

这是一个复合赋值。基本上你在做:

xr.Settings.ValidationFlags = 
    xr.Settings.ValidationFlags | 
    XmlSchemaValidationFlags.ReportValidationWarnings;

这实际上会将XmlSchemaValidationFlags.ReportValidationWarnings 添加到xr.Settings.ValidationFlags 中包含的标志集。

【讨论】:

那么,它为什么要这样做呢?我无法理解手术。【参考方案4】:

这是布尔 OR-Equals。

相当于:

xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;

确保XmlSchemaValidationFlags.ReportValidationWarnings 中的位已设置。

【讨论】:

【参考方案5】:

|= 是将两个值组合在一起并将结果分配给第一个变量的快捷方式。

xr.Settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;

相当于:

xr.Settings.ValidationFlags = xr.Settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;

| 是 C# 中的 OR 运算符,因此上面的代码有效地在值 xr.Settings.ValidationFlags 上设置了 ReportValidationWarnings 标志。

【讨论】:

赋值运算符之后的比较究竟是怎么发生的?我知道它在比较位,但我有点难以理解它。 根本不是在比较位。如果你有两个字节1001 1101 和你OR 它和1100 1011 你会得到1101 1111。如果它在任一操作数中设置了一个位,则在结果中设置它。 |= 的简写只是说明OR 的左侧操作数是|= 左侧的操作数。 下面的链接不是表示正在进行按位比较吗? msdn.microsoft.com/en-us/library/h5f1zzaw%28v=vs.71%29.aspx。我想我的困惑在于:bool b = true; b |= false; 但 b 仍然返回 true。我觉得自己很愚蠢,但我不明白这如何转化为上面发生的事情。 | 表示OR;如果任一参数为真,则结果为真。在这种情况下,它是按位的OR,这意味着如果任一参数中的任何位为 1,则它保持为 1。【参考方案6】:

在这种情况下,您将在 ValidationFlags 中设置 XmlSchemaValidationFlags.ReportValidationWarnings 标志。

|= 一般是按位的or 运算符,如果是Flags,则用于设置标志。

【讨论】:

以上是关于在 C# 中使用 |= 运算符时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当你在同一个 Perl 语句中有一个条件运算符和一个后缀条件时会发生啥?

当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生啥?

当你逻辑不是浮点数时会发生啥?

为啥 C# 'is' 运算符在比较两个布尔值时会给出正确的结果,我应该使用它吗?

问号和点运算符是啥意思?在 C# 6.0 中是啥意思?

运算符“<<”在 C# 中是啥意思?