我正在阅读源代码,我发现了这样的声明:
if (Char.IsWhiteSpace(text[i]) | GetSpecialChars.Contains(text[i]))
最初,我认为它是拼写错误,而不是||
(或)运算符。但令我惊讶的是,它已被编译。怎么可能?是|相当于||用布尔类型?
提前致谢。
答案 0 :(得分:4)
||
是|
的短路版本。在if语句中,即使字符是空格,也会执行GetSpecialChars.Contains
方法,而||
将停止评估而不执行右侧。
答案 1 :(得分:4)
我建议它可能是一个拼写错误,但它仍然会有效。
boolean |
很少见的原因是:
||
是唯一正确的。如果右侧的表达式抛出左侧的表达式为真,例如x == null || x.Length == 0
中的表达式将在x == null | x.Length == 0
时为null或零长度字符串或数组成功返回true会抛出空字符串或数组的异常,因为仍会检查Length
属性。||
会更快。它可能只是几个时钟周期更快(虽然如果rhs上的表达式很昂贵也可能更多),但它很难算作过早的优化,我们都习惯使用这种形式。 (你在决定左边哪个以及右边哪个可能是另一个问题上付出了多少努力)。问题中的例子属于第二点。在实践中|
而不是||
的唯一影响是几纳秒的浪费。这并不重要,但确实导致||
成为习惯。
(另一方面,如果一个名为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)