需要解释,二元运算符|使用布尔类型?

时间:2012-01-25 00:56:03

标签: c# .net operators

我正在阅读源代码,我发现了这样的声明:

if (Char.IsWhiteSpace(text[i]) | GetSpecialChars.Contains(text[i]))

最初,我认为它是拼写错误,而不是||(或)运算符。但令我惊讶的是,它已被编译。怎么可能?是|相当于||用布尔类型?

提前致谢。

4 个答案:

答案 0 :(得分:4)

|||的短路版本。在if语句中,即使字符是空格,也会执行GetSpecialChars.Contains方法,而||将停止评估而不执行右侧。

答案 1 :(得分:4)

我建议它可能是一个拼写错误,但它仍然会有效。

boolean |很少见的原因是:

  1. 大部分时间||是唯一正确的。如果右侧的表达式抛出左侧的表达式为真,例如x == null || x.Length == 0中的表达式将在x == null | x.Length == 0时为null或零长度字符串或数组成功返回true会抛出空字符串或数组的异常,因为仍会检查Length属性。
  2. 剩下的大部分时间||会更快。它可能只是几个时钟周期更快(虽然如果rhs上的表达式很昂贵也可能更多),但它很难算作过早的优化,我们都习惯使用这种形式。 (你在决定左边哪个以及右边哪个可能是另一个问题上付出了多少努力)。
  3. 就可读性而言,一些粉丝使用它的结构还不清楚。
  4. 问题中的例子属于第二点。在实践中|而不是||的唯一影响是几纳秒的浪费。这并不重要,但确实导致||成为习惯。

    (另一方面,如果一个名为GetSpecialChars的属性或一个名为Contains的方法具有副作用,这意味着它必须被调用,那么该属性确实需要重命名以使其更清晰!)。

    关于它唯一有用的时间要么是因为我们确实需要右手表达的一些副作用,要么是基于它的赋值形式|=

    在前一种情况下,总是值得考虑另外一种方法,即在单独的语句中评估两种表达式,然后对结果进行OR运算,以便更清楚地了解副作用以及结果。

    在后一种情况下,它可以使代码更易读,或者至少对某些人来说更易读的代码!但许多人发现它掩盖了事物。

答案 2 :(得分:1)

没有错,这是一个布尔OR运算符,而不是由OR ELSE表示的||运算符。不同之处在于,常规OR不会short-circuit,而OR ELSE会这样做。

在您的具体情况下,即使GetSpecialChars.Contains(text[i])返回Char.IsWhiteSpace(text[i]),也会调用true。如果您将|替换为||,则不会再发生这种情况(例如,如果GetSpecialChars.Contains(text[i])Char.IsWhiteSpace(text[i])),则true将不会被调用。

答案 3 :(得分:0)

| 运算符一般有两个含义与积分一起使用并与布尔值一起使用。在第一种情况下,它计算积分按位OR ,而在后一种情况下,它与逻辑OR >布尔值。

第二种情况(逻辑 - 或情况)带来另外两种含义:

“|”计算逻辑OR ,并限制它评估两个值,即x |当且仅当x和y都为假时,y == false。

“||”做同样的事情,但只在必要时才评估第二个操作数。所以在前面的例子中是x ||一旦x被评估为真,y将评估为真,而不查看y。

您可以直接参考herehere

的MSDN文档

希望这有帮助。