A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张久朝 中级黑马   /  2013-6-19 23:11  /  1306 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张久朝 于 2013-6-19 23:11 编辑

一、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 = 0Dim 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#中的&&和||(短路运算符)。



2 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报

班门弄斧了谢谢支持哈:P
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马