或者与OrElse对比

OrE*_*lse 91 vb.net

什么之间的区别还是OrElse运算

if temp is dbnull.value or temp = 0
Run Code Online (Sandbox Code Playgroud)

产生错误:

未对类型"DBNull"定义运算符"="并键入"整数".

而这一个就像一个魅力!?

if temp is dbnull.value OrElse temp = 0
Run Code Online (Sandbox Code Playgroud)

Aak*_*shM 138

OrElse是一个短路运营商,Or不是.

通过布尔'或'运算符的定义,如果第一项是True,则整体肯定是真的 - 所以我们不需要评估第二项.

OrElse知道这一点,因此temp = 0一旦确定,就不会尝试评估temp Is DBNull.Value

Or不知道这一点,并将始终尝试评估这两个术语.什么时候temp Is DBNull.Value,它不能与零比较,所以它会倒下.

你应该使用......好吧,无论哪个有意义.

  • @ malach:我想是这样的(你在其他大多数语言中都默认使用OrElse行为):在复合条件中调用具有副作用的函数并不是一个好主意,它会使代码无法读取. (4认同)
  • 或者在第二项没有触发错误的所有情况下都有意义,如果第一项是真的...... (3认同)
  • @ awe:是的,但为什么你甚至想浪费时间评估一些定义不会改变表达结果的东西? (3认同)
  • @MarkJ:我真的不认为额外的四个字符会破坏可读性。另一方面,使用依赖于副作用存在的运算符(如 Malach 所写)来有意义听起来是个坏主意(并且会使可读性变得更难!)。我会认为这些地方的副作用是一个很大的禁忌,并且想不出任何我更喜欢“Or”而不是“OrElse”的情况。遗憾的是,这些运算符以这种方式工作,因为即使使用“Or”(尤其是来自其他语言时),“OrElse”行为也可能是大多数人所期望的。 (3认同)
  • 那么,或者只有当我调用一个函数或者我的代码所依赖的副作用时才有意义? (2认同)

小智 38

这与C#的行为相同,其中每个人都使用Coditional Or(||)和Conditional And(&&),其中你也有正常的Or(|)和普通的和(&).所以将C#与VB.Net进行比较是:

| =>或者

|| => OrElse

&=>并且

&& => AndAlso

condifitonal布尔运算符非常有用,可以防止嵌套if构造.但有时需要普通的布尔运算符来确保命中两个代码路径.

  • 我从来没有真正知道这是可用的.感谢您提供新信息.很高兴知道,即使我不能真正看到任何我想要使用"|"的情况.我认为这需要第二个条件才能使副作用产生任何意义,而在我看来这本身就没什么意义!;) (7认同)
  • 嗯,据我所知,`|`和`&`是C#中的按位运算符,根本不是布尔运算. (4认同)

ste*_*ell 8

OrElse被短路,这意味着如果第一侧是匹配,则只测试表达式的一侧.

就像AndAlso只会测试表达式的一面,如果前半部分是失败的话.


Lar*_*arz 8

OrElse 评估第一个表达式,如果为真,则将继续执行该语句,而 OR 会先评估两个表达式,然后再继续执行其语句。

例子:

Textbox1.Text= 4

Textbox2.Text= ""
Run Code Online (Sandbox Code Playgroud)

使用 OrElse

  If TextBox1.Text > 2 OrElse TextBox2.Text > 3 Then
      MsgBox("True")
  End If
Run Code Online (Sandbox Code Playgroud)

结果是:正确


使用或

 If TextBox1.Text > 2 Or TextBox2.Text > 3 Then

            MsgBox("True")
  End If
Run Code Online (Sandbox Code Playgroud)

结果是:错误无法将字符串转换为双精度。


Uta*_*aal 6

(我看了其他答案,发现我错了)

OrElse 运算符“对两个表达式执行短路逻辑或”,也就是说:如果左操作数为真,那么整个表达式保证为真,则右操作数甚至不会被计算(这在以下情况中很有用)案例如下:

string a;
//...
if (a is null) or (a = "Hi") //...
Run Code Online (Sandbox Code Playgroud)

以避免右侧操作数抛出 NullReferenceException。

我由衷地感到惊讶的是,这种(惰性求值or)并不是andC/C++ 和 C#(以及许多其他语言...)中的默认行为。

  • 问题是,在 VB 经典中,*只有*And 和 Or,它们是非短路的。我**认为**我说的没错,VB.NET 的第一个测试版实际上改变了这些运算符的行为 - 引起了轩然大波,因此它们被改回来,并引入了 AndAlso 和 OrElse(短路)。我只能想象,如果这些是最好的名字,他们一定会考虑的替代名称...... (8认同)