在 C#语言中进行类型转换的另一种方式是使用 is 操作符。 is 检查一个对象是否兼容于指定的类型,并返回一个 Boolean 值: true false。注意 is 操作符永远不会抛出异常,以下代码进行了演示:

Object o = new Object();
Boolean b1 = (o is Object); // b1 为 true.
Boolean b2 = (o is Employee); // b2 为 false.

如果对象引用是 nullis 操作符总是返回 false,因为没有可检查其类型的对象。 is 操作符通常像下面这样使用:

if (o is Employee) {
Employee e = (Employee) o;
// 在 if 语句剩余的部分中使用 e
}

在这段代码中, CLR 实际会检查两次对象的类型。 is 操作符首先核实 o 是否兼容于 Employee 类型。如果是,那么在 if 语句内部执行转型时, CLR 再次核实 o 是否引用一个 Employee。 CLR 的类型检查增强了安全性,但无疑也会对性能造成一定影响。这是因为 CLR 首先必须判断变量( o)引用的对象的实际类型。然后, CLR 必须遍历继承层次结构,用每个基类型去核对指定的类型( Employee)。由于这是一个相当常用的编程模式,所以 C#专门提供了 as 操作符,目的就是简化这种代码的写法,同时提升其性能。

Employee e = o as Employee;
if (e != null) {
// 在 if 语句中使用 e
}

在这段代码中, CLR 核实 o 是否兼容于 Employee 类型;如果是, as 会返回对同一个对象的一个非 null引用。如果 o 不兼容于 Employee 类型, as 操作符会返回 null。注意, as 操作符造成 CLR 只校验一次对象的类型。 if 语句只是检查 e 是否为 null。这个检查的速度比校验对象的类型快得多。
as 操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转型,结果就是 null。所以,正确的做法是检查最终生成的引用是否为 null。如果企图直接使用最终生成的引用,会抛出一个 System.NullReferenceException 异常。以下代码对此进行了演示:

Object o = new Object(); // 新建一个 Object 对象
Employee e = o as Employee; // 将 o 转型为一个 Employee
// 上述转型操作会失败,不会抛出异常,但 e 会被设为 null
e.ToString(); // 访问 e 会抛出一个 NullReferenceException 异常

最新文章

  1. 验证mongodb副本集并实现自动切换primary~记录过程
  2. iOS利用通知逆传值
  3. web sql database数据存储位置
  4. NSMutableAttributedString的使用
  5. object references an unsaved transient instance - save the transient instance before flushing错误
  6. 探究platform_driver中的shutdown用途
  7. fastjson和json-lib的区别
  8. Linux下常用的shell命令记录1
  9. iOS-UITextField中给placeholder动态设置颜色的四种方法
  10. sql server 自定义函数的使用
  11. Wix打包系列(七) 添加系统必备组件的安装程序
  12. POJ 1565 Skew Binary(简单的问题)
  13. margin塌陷现象(即在内层设置margin-top无效的解决办法)
  14. 理解javascript this 的绑定过程
  15. C#温故而知新系列 -- 闭包
  16. 虚函数表:QT5与VS2015的差异
  17. js 判断数组中的值是否都相等
  18. 我的BRF+自学教程(三):动态技术
  19. 获取图像的ROI模板区域
  20. mycat 1.6 配置【仅学习测试配置使用】

热门文章

  1. oracle的一些问题
  2. Python内置函数之ascii()
  3. redhat5.8系统学习
  4. 基于AFNetworking封装的网络请求工具类【原创】
  5. plsql programming 12 集合(忽略, 个人感觉用不到)
  6. Android startActivity()和onActivityResult()使用总结(转载)
  7. repaint和reflow的相关知识
  8. marquee标签跑马灯连续无空白播放效果 纯CSS(chrome opera有效)
  9. ThinkPHP与EasyUI整合之三(searchbox):在datagrid中查询指定记录
  10. [浪风JQuery开发]jquery最有意思的IFrame类似应用--值得深入研究