或者与OrElse

或者OrElse有什么区别

if temp is dbnull.value or temp = 0 

产生错误:

运算符'='没有为types'DBNull'定义,而input'Integer'。

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

 if temp is dbnull.value OrElse temp = 0 

OrElse是一个短路操作员, Or不是。

通过布尔运算符的定义,如果第一项是真的,那么整体肯定是真的 – 所以我们不需要评估第二项。

OrElse知道这一点,所以一旦build立了temp Is DBNull.Value ,就不尝试和评估temp = 0 temp Is DBNull.Value

Or不知道这一点,并将始终试图评估这两个术语。 当temp Is DBNull.Value ,它不能被比较为零,所以它会翻倒。

你应该使用…好,无论哪一个是有道理的。

这与C#中的行为是一样的,其中每个人都使用Coditional Or(||)和Conditional And(&&),也有正常的Or(|)和Normal(&)。 所以比较C#和VB.Net是:

| =>或者

|| => OrElse

&=>而且

&& =>还有

condifitonal布尔运算符是非常有用的防止嵌套如果结构。 但是有时需要使用正常的布尔运算符来确保触发两个代码path。

OrElse是短路的 ,这意味着只有一方的expression式将被testing,如果第一方是一个匹配。

正如同样,如果上半场失败,他也只会testing一个expression方式。

(我看了其他的答案,并意识到我是非常错误的)

OrElse运算符“对两个expression式执行短路逻辑析取”,也就是说:如果左边的操作数是真的,所以整个expression式保证为真,那么右边的操作数就不会被评估(这对于例如:

 string a; //... if (a is null) or (a = "Hi") //... 

避免由右侧操作数抛出的NullReferenceException。

我真的很惊讶,这个( 懒惰评估 )不是默认行为的orand因为它是在C / C + +和C#(和许多其他语言…)

伯特的答案不是很准确。 '|' 或'&'是逻辑运算符,在C#中,它总是作为位运算符,请看下面的代码为例

  static void Main() { object a = null; int b = 3; if (a == null | a.ToString() == "sdffd") { Console.WriteLine("dddd"); } Console.WriteLine(b | b); Console.Read(); } 

以下是IL

  .method private hidebysig static void Main() cil managed { .entrypoint // Code size 62 (0x3e) .maxstack 3 .locals init ([0] object a, [1] int32 b, [2] bool CS$4$0000) IL_0000: nop IL_0001: ldnull IL_0002: stloc.0 IL_0003: ldc.i4.3 IL_0004: stloc.1 IL_0005: ldloc.0 IL_0006: ldnull IL_0007: ceq IL_0009: ldloc.0 IL_000a: callvirt instance string [mscorlib]System.Object::ToString() IL_000f: ldstr "sdffd" IL_0014: call bool [mscorlib]System.String::op_Equality(string, string) IL_0019: or IL_001a: ldc.i4.0 IL_001b: ceq IL_001d: stloc.2 IL_001e: ldloc.2 IL_001f: brtrue.s IL_002e IL_0021: nop IL_0022: ldstr "dddd" IL_0027: call void [mscorlib]System.Console::WriteLine(string) IL_002c: nop IL_002d: nop IL_002e: ldloc.1 IL_002f: ldloc.1 IL_0030: or IL_0031: call void [mscorlib]System.Console::WriteLine(int32) IL_0036: nop IL_0037: call int32 [mscorlib]System.Console::Read() IL_003c: pop IL_003d: ret } // end of method Program::Main 

当你使用|| 要testing“a == null”和“a.ToString()==”sdffd“,IL将会是

  .method private hidebysig static void Main() cil managed { .entrypoint // Code size 63 (0x3f) .maxstack 2 .locals init ([0] object a, [1] int32 b, [2] bool CS$4$0000) IL_0000: nop IL_0001: ldnull IL_0002: stloc.0 IL_0003: ldc.i4.3 IL_0004: stloc.1 IL_0005: ldloc.0 IL_0006: brfalse.s IL_001d IL_0008: ldloc.0 IL_0009: callvirt instance string [mscorlib]System.Object::ToString() IL_000e: ldstr "sdffd" IL_0013: call bool [mscorlib]System.String::op_Equality(string, string) IL_0018: ldc.i4.0 IL_0019: ceq IL_001b: br.s IL_001e IL_001d: ldc.i4.0 IL_001e: stloc.2 IL_001f: ldloc.2 IL_0020: brtrue.s IL_002f IL_0022: nop IL_0023: ldstr "dddd" IL_0028: call void [mscorlib]System.Console::WriteLine(string) IL_002d: nop IL_002e: nop IL_002f: ldloc.1 IL_0030: ldloc.1 IL_0031: or IL_0032: call void [mscorlib]System.Console::WriteLine(int32) IL_0037: nop IL_0038: call int32 [mscorlib]System.Console::Read() IL_003d: pop IL_003e: ret } // end of method Program::Main 

现在你可以看到区别了,请不要以为'|' 或'和'作为条件运算符,它只是一个逻辑运算符,我不认为有必要用它来判断条件

OrElse首先评估第一个expression式,然后如果它是真的,它将进行到语句,而OR评估两个expression式,然后才会进入他们的语句。

例:

 Textbox1.Text= 4 Textbox2.Text= "" 

使用OrElse

  If TextBox1.Text > 2 OrElse TextBox2.Text > 3 Then MsgBox("True") End If 

结果是: TRUE


使用OR

  If TextBox1.Text > 2 Or TextBox2.Text > 3 Then MsgBox("True") End If 

结果是:错误不能将string转换为double。