或者与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。
我真的很惊讶,这个( 懒惰评估 )不是默认行为的or
和and
因为它是在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。