欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【关于C# if语句中并列条件的执行】,下面是详细的讲解!
关于C# if语句中并列条件的执行
C#语言中也是如此。当多个条件进行逻辑与操作的时候,判定会从表达式左边执行到右边,遇到任何一个为假,后面就都不做了。这很聪明,然而如果后面的条件会抛出异常,就是个潜在的问题。一旦之前的条件为真,就会继续执行,执行到抛出异常的条件时,程序就爆了,哈哈。我们可以写个简单的demo试试。下面的这段代码是坑爹的,之后我会说明原因,但大家可以先从直观的层面上理解一下,最后我会给出正确的测试方法。
这段代码乍看没问题,并且在运行时也给出了我们期望的结果,即第一段语句输出Shit,不抛出异常(当前面为false,后面会抛异常的ds.Tables[0].Rows.Count > 0就不做),而第二段语句因为之前是true,所以要执行对dataset的判断,所以抛出异常。但如果用reflector反编译程序集,就会发现,编译器已经把上面的代码优化成了下面这种形式,我们的if语句中写死的true和false已经被阉割掉了,所以并不能说明if语句执行的问题。
其实,如果你仔细观察,在输入这段代码的过程中,VS就已经提示if (false && ds.Tables[0].Rows.Count > 0)中,后者是不可达的。这是即时编译的效果。既然即时编译说后面的代码不可达,就意味着不可达的代码会在编译期被切掉。因此,刚才我们在上面看到的编译结果也就是自然的事情了。
同样,如果你直接把1==0, 1==1这样的条件拼上去的话,编译器也会发现的。所以我们要找一种不会被编译器发现的写法,要让我们的条件判定代码只能在运行时执行,而不是编译时被调整。比如下面这种:
我们再来执行,发现这次的结果是真正意义的满足了我们的目的,说明了当多个条件进行逻辑与的时候,C#的执行机制:
在or关系中,只要有一个true,整个表达式就是true了。但如果你让可能引发异常的语句先于之后会返回true的语句执行,就会爆。
比如这样写的话会爆,因为判断Length的前提是得有个string:
上面这段代码可以用reflector打开mscorlib中的System.String找到~
关于关于C# if语句中并列条件的执行的用户互动如下:
相关问题:C#z中怎么终止IF 条件句直接执行其他的...
答:public static int Quotient(int a, int b) { int quotientTotal; if (b == 0) { Console.WriteLine( "Error! The divisor can 't be zero! "); break; (?C#语言如何终止Quotient函数,返回调用它的Main函数中) } else { quotientTotal = a / b; ... >>详细
相关问题:c#中的if语句如何在条件中使用或者,如a等于1时执...
答:你问的有点歧义。不知道是不是如果a等于1或等于2时执行本代码? if (a==1 || a==2) //如果a是字符型就把1,2加双引号if (a=="1" || a=="2") { //执行代码 } >>详细
相关问题:C#判断到了if条件为真,但是却并不执行if里的语句。
答:要用Invoke来调用,多线程 this.Invoke(new Action(() => { WriteMacLabel.Text = ""; OtherTestLabel.Text = ""; })); >>详细
- 【asp】asp.net url重写浅谈-net-url重写
- 【DataSet】DataSet、DataTable、DataRow区别详解
- 【创建】ASP.NET Web API教程 创建域模型的方法详
- 【asp】asp.net ubb使用代码-net-ubb使用
- 【默认图片】图片不存在使用默认图片代替的实例
- 【asp】asp.net 页面转向 Response.Redirect Ser
- 【页面打印】关于ASP.NET页面打印技术的常用方法
- 【MVC5】MVC 5 第一章 创建MVC 5 web应用程序-net
- 【MVC】一个简单MVC5 + EF6示例分享-EF6实例-MVC5
- 【服务器】asp.net页面状态管理cookie和服务器状
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
