C#语言中也是如此。当多个条件进行逻辑与操作的时候,判定会从表达式左边执行到右边,遇到任何一个为假,后面就都不做了。这很聪明,然而如果后面的条件会抛出异常,就是个潜在的问题。一旦之前的条件为真,就会继续执行,执行到抛出异常的条件时,程序就爆了,哈哈。

我们可以写个简单的demo试试。下面的这段代码是坑爹的,之后我会说明原因,但大家可以先从直观的层面上理解一下,最后我会给出正确的测试方法。

复制代码 代码如下:

static void Main(string[] args)

{

DataSet ds = null;

if (false && ds.Tables[0].Rows.Count > 0)

{

Console.WriteLine("Fuck");

}

else

{

Console.WriteLine("Shit");

}

if (true && ds.Tables[0].Rows.Count > 0)

{

Console.WriteLine("WOW");

}

else

{

Console.WriteLine("KAO");

}

Console.ReadKey();

}

这段代码乍看没问题,并且在运行时也给出了我们期望的结果,即第一段语句输出Shit,不抛出异常(当前面为false,后面会抛异常的ds.Tables[0].Rows.Count > 0就不做),而第二段语句因为之前是true,所以要执行对dataset的判断,所以抛出异常。但如果用reflector反编译程序集,就会发现,编译器已经把上面的代码优化成了下面这种形式,我们的if语句中写死的true和false已经被阉割掉了,所以并不能说明if语句执行的问题。

复制代码 代码如下:

private static void Main(string[] args)

{

DataSet ds = null;

Console.WriteLine("Shit");

if (ds.Tables[0].Rows.Count > 0)

{

Console.WriteLine("WOW");

}

else

{

Console.WriteLine("KAO");

}

Console.ReadKey();

}

其实,如果你仔细观察,在输入这段代码的过程中,VS就已经提示if (false && ds.Tables[0].Rows.Count > 0)中,后者是不可达的。这是即时编译的效果。既然即时编译说后面的代码不可达,就意味着不可达的代码会在编译期被切掉。因此,刚才我们在上面看到的编译结果也就是自然的事情了。

同样,如果你直接把1 == 0, 1 == 1这样的条件拼上去的话,编译器也会发现的。所以我们要找一种不会被编译器发现的写法,要让我们的条件判定代码只能在运行时执行,而不是编译时被调整。比如下面这种:

复制代码 代码如下:

static void Main(string[] args)

{

DataSet ds = null;

int i = 0;

int j = 1;

if (i + j == 0 && ds.Tables[0].Rows.Count > 0)

{

Console.WriteLine("Fuck");

}

else

{

Console.WriteLine("Shit");

}

if (i + j == 1 && ds.Tables[0].Rows.Count > 0)

{

Console.WriteLine("WOW");

}

else

{

Console.WriteLine("KAO");

}

Console.ReadKey();

}

我们再来执行,发现这次的结果是真正意义的满足了我们的目的,说明了当多个条件进行逻辑与的时候,C#的执行机制:

写这篇文章的意义,是为了让大家在写程序的时候,注意条件中可能发生异常的地方。比如我们模拟String.IsNullOrEmpty()。

在or关系中,只要有一个true,整个表达式就是true了。但如果你让可能引发异常的语句先于之后会返回true的语句执行,就会爆。

比如这样写的话会爆,因为判断Length的前提是得有个string:

复制代码 代码如下:

public static bool IsNullOrEmpty(string str)

{

if (str.Length == 0 || str == null)

{

return true;

}

return false;

}

这样写就正常:

复制代码 代码如下:

public static bool IsNullOrEmpty(string str)

{

if (str == null || str.Length == 0)

{

return true;

}

return false;

}

微软是这样写的,碉堡了!

复制代码 代码如下:

public static bool IsNullOrEmpty(string value)

{

if (value != null)

{

return (value.Length == 0);

}

return true;

}

上面这段代码可以用reflector打开mscorlib中的System.String找到~

时间: 2012-02-23

c 语言查询条件并列怎么用,关于C# if语句中并列条件的执行相关推荐

  1. 在Java语言的if语句是什么表达式,if语句中的条件表达式中只能使用

    if语句中的条件表达式中只能使用关系或逻辑表达式吗?别的人十句话都不会伤到小编,但你的一句话就可以把小编伤得撕心裂肺. 不是,可以用任意表达式. if语句是指编程语言(包括c语言,C#,,java,V ...

  2. java中if(a.c())_if 语句中的条件语句只能是() 类型。_学小易找答案

    [单选题]设 x,y 均为已定义的类名,下列声明对象 x1 的语句中正确的是 ( ) [单选题]C# 中引入命名空间使用 [简答题]class Parent{ private String name; ...

  3. c#语言中if语句多条件,关于C# if语句中并列条件的执行

    C#语言中也是如此.当多个条件进行逻辑与操作的时候,判定会从表达式左边执行到右边,遇到任何一个为假,后面就都不做了.这很聪明,然而如果后面的条件会抛出异常,就是个潜在的问题.一旦之前的条件为真,就会继 ...

  4. MySQL语句中过滤条件放在哪?on、where还是having,他们区别和联系

    SQL语句中,过滤条件放在不同筛选器on.where和having的区别和联系. 蚂蚁金服的一道SQL面试题如下:SQL语句中,过滤条件放在on和where子句中的区别是什么? 当时满脑子是left ...

  5. 关于python语言、下列说法不正确的是-下列语句中,___________是不正确的Python语句...

    问题:下列语句中,___________是不正确的Python语句 更多相关问题 2,11,14,27,()A.34B.32C.30D.28 二氧化硫是造成酸雨的重要原因.某地区饱受酸雨困扰,为改善这 ...

  6. shell if多个条件判断_萌新关于Excel VBA中IF条件判断语句的一点心得体会

    作者:金人瑞 <Excel VBA175例无理论纯实战教程>学员 最近正在学习郑广学老师的VBA 175例教程,这是一篇新手向的文章,也是一个新手的总结,高手可以批评文章中的不足之处,也可 ...

  7. sql 语句中count()条件计数

    在count函数里直接对需要计数的变量写条件表达式 但是需要加 'or NULL',如下所示: select count(distinct job_id), count(pay_pv>0 or ...

  8. SQL 语句中 where 条件后 写上1=1 是什么意思

    这段代码应该是由程序(例如Java)中生成的,where条件中 1=1 之后的条件是通过 if 块动态变化的.例如: String sql="select * from table_name ...

  9. SQL 语句中 where 条件后 写上1=1 是什么意思

    前言 where 1=1是sql语句条件逻辑判断表达式,由于1=1成立,恒为真,该表达式1=1将始终返回"真".这种写法实际目的是为了获取逻辑值"True",其 ...

  10. ::在sql语句中是什么写法_不懂就问:SQL 语句中 where 条件后 写上1=1 是什么意思...

    程序员在编程过程中,经常会在代码中使用到"where 1=1",这是为什么呢? SQL注入 初次看到这种写法的同学肯定很纳闷,加不加where 1=1,查询不都一样吗?例如: se ...

最新文章

  1. 让我们讨论一下变量,以及为什么要在JavaScript中使用它们。
  2. 收藏 | 一文带你总览知识蒸馏,详解经典论文
  3. 2.Java中String,StringBuilder以及StringBuffer的关系与区别
  4. 如何放出Linux内核中的链表大招
  5. 【吐血整理】java正则表达式详解
  6. WPF特效-实现弧形旋转轮播图
  7. 检查您的REST参数!
  8. java户名的正则表达式_java – 用于验证用户名的正则表达式
  9. python glob用法_glob模块使用教程
  10. MinGW GCC 7.1.0 2017年6月份出炉啦
  11. ‘ssh-keygen‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  12. PowerDesigner教程系列(二)概念数据模型
  13. [2019杭电多校第二场][hdu6601]Keen On Everything But Triangle
  14. 计算机视觉:关于Graph cuts的简介及相关资源
  15. leetcode 868. Binary Gap
  16. VMware Workstation 安装ssh服务器
  17. 读《淘宝技术这十年》有感
  18. C++实现图片格式转换
  19. 如何避免B端产品失败(近万字解析)
  20. 10款堪称神器的免费电脑软件推荐

热门文章

  1. GIS空间分析(四)—— 空间分布类型
  2. CityEngine 免费试用申请、下载与配置(2018)
  3. Greedy 贪心算法
  4. Gym 100015A
  5. Codeforces Gym 100015F Fighting for Triangles 状压DP
  6. 支付宝,微信付款码正则表达式
  7. java-微信语言amr文件转码为Mp3文件
  8. 关于注意力的自上而下和自下而上(top-down attention and bottom-up attention)
  9. 北大计算机系赖陆程,北大计算机系一年级学生彭某从五楼阳台上跳下。彭某曾是一个相当聪明...
  10. Pale Moon 15.1 发布,苍月浏览器