【问题标题】:In C#, what does '|=' do?在 C# 中,'|=' 有什么作用?
【发布时间】:2012-03-25 11:14:37
【问题描述】:

我似乎无法通过 Google 搜索它 - 似乎不喜欢搜索字符串中的语法。谢谢你的帮助。

【问题讨论】:

  • 一分钟内有 7 个答案 ;) -- 无论如何,值得一提的是 x |= y 与 x = x | 并不完全相同。 y,在副作用等方面,在某些情况下区分两者,但这个概念仍然存在。
  • @ChrisShain 有点不同,因为 C# 和 C++ 对于 |= IIRC 的扩展具有不同的语义。
  • @JaredPar 是的,我总是忘记副作用差异的限制。
  • 我也认为你可以在 C++ 中覆盖它,但不能在 C# 中覆盖它,如果有记忆的话。

标签: c# operators


【解决方案1】:

在 C 和其他遵循 C 语法约定的语言中,例如 C++、Perl、Java 和 C#,(a | b) 表示按位或;而双竖线 (a || b) 表示(短路的)逻辑或。

【讨论】:

  • 这不是按位,而是按位或分配回左侧存储位置
【解决方案2】:

这是一个有点明智的分配。它大致是以下内容的简写

x |= y;
x = x | y;

注意:这不是真正的上述情况,因为 C# 规范保证 x 的副作用只发生一次。所以如果x 是一个复杂的表达式,编译器会生成一些有趣的代码来确保副作用只发生一次。

Method().x |= y;
Method().x = Method().x | y;  // Not equivalent

var temp = Method();
temp.x = temp.x | y;  // Pretty close

【讨论】:

  • 如果左边是属性,getter也只会被调用一次,原理是一样的(因为属性基本上就是get方法)。
  • @Servy 考虑更有趣:(await x).SomeMethod().y |= z; 或我个人最喜欢的(await x)[await y].z += await a;
  • @JarredPar 这就是我画线的地方,并打了写这样一条线的开发人员。尽管很有趣,但它应该出现在不止一条线上。
  • @JarredPar 哇,你的编辑更可怕;第一个我至少可以把头绕过去。大声笑+1。这是添加+= 还是订阅+= 的事件?
  • @Servy 不幸的是,作为编译器开发人员,我无法阻止编写这种代码的人。您必须确保糟糕的代码正常运行
【解决方案3】:

a |= b 在语义上与a = a | b 相同

【讨论】:

    【解决方案4】:

    表达式a |= b 等价于赋值a = a | b,其中| 是按位或运算符。*

    * 不完全,但对于大多数用途来说足够接近。

    【讨论】:

    • 它不是完全等效的,因为 C# 编译器保证 a 的副作用只在 |= 情况下发生一次
    • @JaredPar: 好的 :) 但是如果你把 ab 作为表达式而不是代码,那么是的,这是真的。跨度>
    【解决方案5】:

    类似于+=,但使用二进制 OR

    int x = 5;
    x |= 6;  // x is now 7: 5 | 6
    

    您还可以执行其他操作,例如 &=/=*= 等。几乎任何二进制(两个参数)运算符

    【讨论】:

      【解决方案6】:

      |= 是按位或赋值运算符。在这里查看 msdn 文档http://msdn.microsoft.com/en-us/library/h5f1zzaw(v=vs.100).aspx

      【讨论】:

      • +1 表示链接,-1 表示具有误导性的描述。 |是按位或运算符,|= 是按位或运算符与赋值相结合。
      【解决方案7】:

      你会找到答案的 here on msdn

      x |= y
      

      相同
      x = x | y
      

      【讨论】:

        猜你喜欢
        • 2022-09-28
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多