【问题标题】:Why aren't short circuited operators the default为什么短路运算符不是默认值
【发布时间】:2012-02-27 04:03:49
【问题描述】:

鉴于典型的编码准则是“不要在方法调用中引起副作用”。并且不使用短路运算符的唯一原因(我知道 - 如果我错了请赐教)是当您依赖后续代码中方法调用的副作用时。为什么 C# 和 VB.NET 等语言中的默认运算符不是短路版本?

IE:

 if (Method1() & Method2()) {
 }

 if Method1 And Method2 then
 End if

 if (Method1() | Method2()) {
 }

 if Method1 Or Method2 then
 End if

实际上(默认情况下)意味着

 if (Method1() && Method2()) {
 }

 if Method1 AndAlso Method2 then
 End if

 if (Method1() || Method2()) {
 }

 if Method1 OrElse Method2 then
 End if

【问题讨论】:

标签: c# vb.net language-agnostic short-circuiting


【解决方案1】:

我认为有两个不同的原因和两个不同的答案。

对于 C#(以及大多数相关的旧语言),单个与号或单个管道实际上对变量进行按位运算(按位而不是逻辑)。这就是为什么在所有 C/C++ 代码中,当有人想要 logical and 时,您会在他们的代码中看到双与号。

对于 VB.NET 我相信答案只是历史。 Legacy Basic 语言一直使用“and”和“or”来进行非短路运算。这是一个非常糟糕的决定,但它一直被带到了 VB.NET。

值得一提的是,所有 Basic 语言也都使用“and/or”关键字进行按位运算。在较早的 Basics 中,没有 AndAlso 或 OrElse 关键字的等价物来强制短路,因此您必须嵌套 If 语句以获得短路 and 的逻辑等价物。

【讨论】:

  • 不,在 C# 中是单曲 |和 & 运算符在布尔值上工作得很好。它们是布尔值的逻辑运算符和整数的位运算符。没有要求对布尔值的逻辑运算是短路的。
  • 它们确实适用于布尔值。我只是说即使对布尔值使用它们也会进行按位运算。当您使用单个 & 或 |在一系列布尔值上,它使用按位运算并将它们视为一系列要评估的 1 位值。这解释器如何实现运算符。
  • 虽然显然是的,这就是解释器实现该功能的方式,但将布尔值的逻辑运算视为“按位”有点奇怪。人们通常认为“按位”操作是对位序列进行操作,而不是对单个布尔值进行操作。在实践中,布尔值不是作为单个位实现的,这是一个实现细节。
  • +1 布尔值是否是单个位,按位做同样的事情。我更喜欢想 |和 & 与布尔值一样,因为它保持语义一致。
猜你喜欢
  • 1970-01-01
  • 2010-10-03
  • 2020-02-18
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多