手机版

关于C# if语句中并行条件的执行

时间:2021-10-10 来源:互联网 编辑:宝哥软件园 浏览:

C#语言也是如此。当多个条件进行逻辑“与”运算时,判断将从表达式的左侧到右侧执行。如果有一个是假的,以后就什么都不做了。这很聪明,但是如果下面的条件抛出异常,那就是一个潜在的问题。以前的条件一旦为真,就会继续执行,当抛出异常条件时,程序就会爆炸,哈哈。我们可以试着写一个简单的演示。下面的代码是骗人的,后面我会说明原因,但是你可以先从直观的层面去理解,最后我会给出正确的测试方法。复制代码如下:静态void main(string[]args){ dataset ds=null;if (false ds。表[0].行数.计数0) {控制台。write line(' Hock ');} else { Console。WriteLine(' Shit ');} if (true ds。表[0].行数.计数0) {控制台。write line(' WOW ');} else { Console。write line(' KAO ');}控制台。ReadKey();}乍一看,这段代码还可以,它也给出了我们在运行时的预期结果,即第一条语句输出Shit时没有抛出异常(前一条语句为false时,ds。Tables[0].Rows.Count 0,后面抛出异常不会做),而前面第二条语句为true,所以需要判断数据集,所以抛出异常。但是,如果用reflector反编译程序集,会发现编译器已经把上面的代码优化成了下面的形式,我们if语句中死真假都被阉割了,所以并不能说明if语句执行的问题。复制代码如下:私有静态void main(string[]args){ dataset ds=null;控制台。WriteLine(' Shit ');if (ds。表[0].行数.计数0) {控制台。write line(' WOW ');} else { Console。write line(' KAO ');}控制台。ReadKey();}其实如果你仔细观察,在输入这段代码的过程中,VS已经表明if (false ds。表[0]。rows.count0)不可访问。这就是即时编译的效果。由于即时编译说下面的代码是不可达的,这意味着不可达的代码将在编译时被切断。所以我们刚才看到的编译结果是很自然的事情。同样,如果直接拼1==0和1==1的条件,编译器就会发现。因此,我们需要找到一种不会被编译器发现的编写方法,这样我们的条件判断代码就只能在运行时执行,而不是在编译时进行调整。比如下面这个:复制代码如下:静态void main(string[]args){ dataset ds=null;int I=0;int j=1;if (i j==0 ds。表[0].行数.计数0) {控制台。write line(' Hock ');} else { Console。WriteLine(' Shit ');} if (i j==1 ds。表[0].行数.计数0) {控制台。write line(' WOW ');} else { Console。write line(' KAO ');}控制台。ReadKey();}我们再执行一次,发现这个结果确实满足了我们的目的,展示了多个条件逻辑and时C#的执行机制:

写这篇文章的意义是让大家在写程序的时候注意到条件中可能出现的异常。让我们模拟字符串。IsNullOrEmpty()。在or关系中,只要有一个真,整个表达式就是真的。但是如果你让可能抛出异常的语句在返回真的语句之前,它就会爆炸。比如这样写,就会爆炸,因为判断Length的前提是要有一个字符串:复制代码的代码如下: public static bool is ullrempty(string str){ if(str。长度==0 | | str==null){返回true}返回false}

正常写入:复制代码如下:公共静态bool is ullrempty(string str){ if(str==null | | str。length==0){返回true}返回false}

这是微软写的。这是个碉堡!复制代码如下:公共静态bool isnullrempty(字符串值){if (value!=null) { return(值。长度==0);}返回true}以上代码可以通过打开System找到。带反射器的mscorlib字符串~

版权声明:关于C# if语句中并行条件的执行是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。