【问题标题】:C# 'or' operator?C#“或”运算符?
【发布时间】:2009-11-17 02:56:28
【问题描述】:

C# 中有or 运算符吗?

我想做:

if (ActionsLogWriter.Close or ErrorDumpWriter.Close == true)
{
    // Do stuff here
}

但我不确定我怎么能做这样的事情。

【问题讨论】:

  • 明确地说,“或”是一个运算符,而不是一个语句。
  • @lndebi:您的问题表明对 C# 的掌握非常不平衡。考虑通过一些教程来平衡自己,然后再考虑包管理器和你正在做的任何其他事情。 msdn.microsoft.com/en-us/library/... 是一个开始的地方。
  • 更不用说你有一个奇怪的 if 语句开头。为什么你只明确说明第二个条件为真,而隐含第一个条件?
  • 是的,我有点自学这些东西,最终我会去上课,但我喜欢边走边学,而不是使用书本或书面文本一次性学习,因为我可以不要问一张纸为什么某些东西不工作或为什么它会那样工作。这就是我向 StackOverflow 提出很多问题的方式
  • 我也是自学的。我可以在 Python 中整天使用 or 运算符。现在我正在阅读一些 C# 代码并看到这个 ||到处都是,我不知道该问什么。感谢提出问题的人,非常感谢那些刚刚给出答案并继续前进的人。

标签: c#


【解决方案1】:

C# 支持两个布尔 or 运算符:单杠 | 和双杠 ||

不同之处在于| 始终检查左侧和右侧条件,而|| 仅在必要时检查右侧条件(如果左侧计算结果为假)。

当右侧的条件涉及处理或导致副作用时,这很重要。 (例如,如果您的 ErrorDumpWriter.Close 方法需要一段时间才能完成或更改某些状态。)

【讨论】:

  • 应该是:||如果左侧评估为假,则仅检查右侧条件?因为 TRUE OR ANYTHING 总是 TRUE?
  • 只是一件小事——布尔运算符当然比这更多,也许改写为“两个布尔/逻辑或运算符”。
  • 小心:||是一个逻辑运算符和 |是二元运算符
  • @Matthieu:不,如果操作数是布尔值,|-operator 是逻辑运算符。如果操作数是整数,则仅将其视为二进制。
【解决方案2】:

另外值得一提的是,在 C# 中,OR 运算符是短路的。在您的示例中, Close 似乎是一个属性,但如果它是一个方法,则值得注意的是:

if (ActionsLogWriter.Close() || ErrorDumpWriter.Close())

根本不同于

if (ErrorDumpWriter.Close() || ActionsLogWriter.Close())

在 C# 中,如果第一个表达式返回 true,则根本不会计算第二个表达式。请注意这一点。在大多数情况下,它实际上对您有利。

【讨论】:

  • 是属性还是方法有关系吗?在这种情况下,我猜想属性代码的调用和方法一样。
  • 这是一个很好的观点。如果属性有副作用(这也是非常糟糕的设计),同样的警告也适用。
【解决方案3】:

从 C# 9 开始,有一个 or 关键字可用于匹配“分离模式”。这是此版本中几个新的pattern matching enhancements 的一部分。

文档中的示例:

public static bool IsLetter(this char c) => c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

【讨论】:

    【解决方案4】:
    if (ActionsLogWriter.Close || ErrorDumpWriter.Close == true)
    {    // Do stuff here
    }
    

    【讨论】:

      【解决方案5】:

      单个“|”运算符将计算表达式的两边。

          if (ActionsLogWriter.Close | ErrorDumpWriter.Close == true)
      {
          // Do stuff here
      }
      

      双运算符“||”仅在表达式返回 true 时计算左侧。

          if (ActionsLogWriter.Close || ErrorDumpWriter.Close == true)
      {
          // Do stuff here
      }
      

      C# 与 C++ 有许多相似之处,但它们仍然是两种语言之间的差异;)

      【讨论】:

        【解决方案6】:

        就像在 C 和 C++ 中一样,布尔或运算符是 ||

        if (ActionsLogWriter.Close || ErrorDumpWriter.Close == true)
        {
            // Do stuff here
        }
        

        【讨论】:

          【解决方案7】:

          或者在 C# 中是 ||

          你可以看看this

          【讨论】:

            猜你喜欢
            • 2013-07-25
            • 2012-11-26
            • 2019-05-03
            • 2016-08-22
            • 2010-12-08
            • 2017-04-13
            • 2013-10-23
            • 2021-09-02
            • 2011-06-15
            相关资源
            最近更新 更多