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找到~

c#语言中if语句多条件,关于C# if语句中并列条件的执行相关推荐

  1. 在不允许新建对象的条件下,将list中指定条件的值去除

    package com.liujianwang.learning;import java.util.LinkedList; import java.util.List;public class Lis ...

  2. c语言中for的用法及实例,for循环语句基本用法及示例

    for 循环语句的使用方法 以C语言为例for循环的一般形式为: for(语句1 ; 语句2 ; 语句3 ) 执行时,先执行一次语句1(注意只执行一次) 之后判断语句2是否成立 易拉环拼命地护着易拉罐 ...

  3. c语言中b的作用是什么意思,C语言中是什么意思?ab怎么理解?

    C语言中&是什么意思?a&b怎么理解?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中& ...

  4. c语言中ai是什么,AICODE在C语言教学中应用研究.doc

    AICODE在C语言教学中应用研究 AICODE在C语言教学中应用研究 摘要:本文研究了AI-CODE作为一种教学工具在C语言教学中的应用.首先,对传统C语言教学的不足.枯燥.缺乏互动进行了分析.其次 ...

  5. [原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件

    C/C++语言中,如何在main.cpp中调用另一个.c文件主要有5种思路: 1.在VS2012 IDE中,将被引用的.c文件后缀名全部修改为.h,然后通过IDE的解决方案资源管理器中鼠标右键单击&q ...

  6. latex中if语句怎么用_如果 (If) | Python 中的条件控制语句详解

    点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐,生活中 ...

  7. c语言中sqrt函数_sqrt()函数以及C ++中的示例

    c语言中sqrt函数 C ++ sqrt()函数 (C++ sqrt() function) sqrt() function is a library function of cmath header ...

  8. c语言中free函数_free()函数与C ++中的示例

    c语言中free函数 C ++ free()函数 (C++ free() function) free() function is a library function of cstdlib head ...

  9. mysql包含条件查询怎么写_mysql中where条件查询

    #进阶2:条件查询 /* 语法: SELECT 查询列表 FROM 表名 WHERE 筛选条件: 分类: 一.按条件表达式筛选 条件运算符:> < = <> >= < ...

最新文章

  1. Android项目开发新版本需要注意的事项
  2. [渝粤教育] 上海交通大学 制造工艺基础 参考 资料
  3. oracle sql条件语句,谁能介绍下Oraclesql之条件语句?
  4. MyBatis3系列__05查询补充resultMap与resultType区别
  5. Linux USB设备驱动程序设计 和 USB下载线驱动设计
  6. mysql 远程 更改
  7. 设计图案之间关系的代码实现
  8. python爬小说收费章节_python 多线程爬小说返回章节乱套。求解
  9. E-Prime软件包及安装
  10. html怎么让一行文字有滚动的效果,HTML标签marquee实现滚动效果
  11. simulink教程(自动控制原理)
  12. java 导出Excel表头
  13. 海归王垠 V.S. 阿里P10赵海平,不对等面试所引起的争议
  14. cogs1570 KMP hash
  15. httprunner 3.x学习10 - parameters 参数化
  16. 课程预约小程序开发需要哪些功能?
  17. 运城学院计算机课,运城学院微机原理与应用精品课程
  18. 借助 Play Commerce 实现购买优化、灵活订阅和收入增长
  19. 正交设计——实战【转】
  20. 计算机表格数字整体加,excel表格整体数据加1怎么处理-怎样才可以在EXCEL表格的数字中全部加1??...

热门文章

  1. 扫地机器人的技术升级之路 自主规划清扫成主流
  2. JavaScript:隐藏、显示div
  3. html电影详情页面,电影
  4. 怎样打印微信文档文件?
  5. 想学习板绘?教你如何在电脑学习绘画!
  6. unity Layer CullingMask
  7. 【数据处理与分析】matplotlib快速入门
  8. 跨域问题No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
  9. excel同一行中如何添加换行
  10. 笨功夫与巧心思,Milvus开源社区的成长