几个容易混淆的逻辑运算
一、C#中的“短路”逻辑符:
C#中“逻辑与”和“逻辑或”都是短路的。所谓“短路”,意味着对于“与”而言,只要一个是false则忽略后面布尔表达式,直接返回false;“或”相反——只要一个是true直接返回true。
下面看一个例子:
int i = 0; if (false && 1 / i != 0) { Console.WriteLine("通过短路与"); } else { Console.WriteLine("未通过"); }
因为&&左边是false,这意味着if无须判断右边那个是不是false或者是其它内容。结果计算的时候不会发生异常。
二、C#中三元运算符和If和IIf:
很多人(包括我)一开始闹了一个很大的笑话——认为C#中“三元运算符”=IIf,是这样吗?我们看一个实际的例子证明:
在C#中:
int i = 0; bool flag = true ? true : 1 / i == 0; Console.WriteLine(flag.ToString());
这个等同于C#中if……else或者是VB.NET的If……Then……Else,并不会产生异常。因为它是带条件计算的。
那么VB.NET中IIf呢?
Dim i As Integer = 0 Dim flag As Boolean = IIf(True, True, 1 \ i = 0) Console.WriteLine(flag)
乍看应该和C#三元运算符一致——但是!实际是错误的!!
反射可以看到IIf其实是微软Microsoft.VisualBasic命名空间下的一个普通方法——
Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object If (Expression) Then Return TruePart End If Return FalsePart End Function
因为是普通方法,所以在调用的时候三个参数必须在参与运算得到结果之后作为参数传入这个IIf函数中进行动态返回,那么当1\i=0计算的时候已经抛出了异常了。
此时,VB.NET应该采用If运算——If还可以这样用:
If(逻辑表达式1,结果1,结果2):直接根据逻辑表达式计算,如果True,才处理结果1并返回,否则处理结果2返回。
另外注意:
1)VB.NET中If(条件1 And 条件2……)中“And”不是短路运算,Or也不是短路运算。证明:
Dim i As Integer = 0 If (False And 1 / 0 = 0) Then Console.WriteLine("通过运算") End If
2)VB.NET中,AndAlso和OrElse相当于C#中的&&和||(短路运算符)。