is和as在类型转换时的性能差异

is和as是.NET中常用的操作,两者都可以实现类型的安全转换,但两者却有所不同。

public class Employee
{

}

public void Add(object obj)//写法一
{
   Employee e=null;
   if(obj is Employee)
   {
       e=(Employee)obj;
       //正常处理
   }
   else
   {
       //其他处理
   }
}

public void Add(object obj)//写法二
{
   Employee e=obj as Employee;
   if(obj==null)
   {
      //其他处理
   }
   else
   {
     //正常处理
   }
}

上面的代码中都是将obj转换成Employee,两者在写法上都是OK的,也可以编译和运行。但是两者在性能上却有些许差别。

is操作需要判断obj的类型是不是Employee,如果是则进行强制转换e=(Employee)obj。在强制转换时,CLR又会对obj进行一次类型的判断,如果不是Employee类型,

则会抛出异常System.InvalidCastException。

as操作符,在CLR阶段会进行一次类型判断,如果是Employee,则转换为Employee类型,如果不是,则转换成null。所以这才有了写法二中的if(obj==null)的判断。

相信到这里,已经明白了这两种写法在性能上的差异。is的写法需要两次类型判断,as只需要一次类型判断。

当然,有的程序员直接是采用下面的这种写法:

public void Add(object obj)//写法三
{
  try
  {
     Employee e=(Employee)obj;
     //正常处理
  }
  catch
 {
   //其他处理
   throw;
 }
}

写法三在程序上是可行的,但是利用try--catch来捕获强制转换失败的异常,性能影响更大,不是推荐的写法。

在《CLR via C#第四版》中更倾向于写法二。

is和as在类型转换时的性能差异,布布扣,bubuko.com

时间: 2024-12-18 19:37:31

is和as在类型转换时的性能差异的相关文章

如何避免类型转换时的异常

分析问题 程序员经常会面临一些类型转行的工作,其中有些是确定可转换的,例如把一个类型对象转换成基类对象,而有些则是带有尝试性的,譬如把基类引用的对象转换成子类,当执行这样的尝试性转换时,程序员就应该做好捕捉异常的准备. 当一个不正确的类型转行发生时,就会产生InvalidCastException异常,程序员有时候会用try.catch块做一些尝试性的类型转换,这样的代码没有任何错误,但是性能却相当糟糕.异常是一种耗费资源的机制,每当异常被抛出时,异常堆栈将被建立,异常信息将被加载,而通常这些工

C正则库做DNS域名验证时的性能对比

C正则库做DNS域名验证时的性能对比 本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a-zA-Z_-]+)*(\\.[a-zA-Z]{2,}\\.)$" 对于正常DNS请求日志中的6177578条日志做正则验证处理. 1,pcre 评测所用的pcre的版本号是:7.8.3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2

Effective C++笔记_条款46 需要类型转换时请为模板定义非成员函数

看这个章节的时候又跑回去看了一下 条款 24,本章的例子就是基于下面这个例子而来的.在 item 24 中,支持混合运算的示例代码如下: 1 class Rational { 2 public: 3 Rational(int numerator = 0, int denominator = 1); 4 int mumerator() const; 5 int denominator() const; 6 private: 7 int numerator; 8 int denominator; 9

Effective C++ Item 46 需要类型转换时请为模板定义非成员函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:当我们编写一个 class template, 而它所提供之"与此 template 相关的"函数支持"所有参数之隐式类型转换"时,请将那些函数定义为 "class template内部的 friend 函数". 示例: template<typename T> class Rational{ public: Ration

是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时

这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常.在继承链中,我们将子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”.很多时候,我们会... Coda 发布于 2015-04-12 14:09 评论(1)阅读(72) 1 http://www.djob.com/job_8EED14ACE3DE31D0.htmlhttp://www.

既然float不能表示所有的int_那为什么在类型转换时C++将int转换成float?

摘要: 既然float不能表示所有的int,那为什么在类型转换时C++将int转换成float? 问题: 代码如下: int i = 23; float f = 3.14; if (i == f) // 执行某段代码 编译器会将i转换成float类型,然后比较这两个float的大小,但是float能够表示所有的int吗?为什么没有将int和float转换成double类型进行比较呢? 回答: 在整型数的演变中,当int变成unsigned时,会丢掉负数部分(有趣的是,这样的话,0u < -1就是

浏览器探测时的性能优化

浏览器探测时的性能优化 在进行浏览器探测时,会基于浏览器的功能就行分支判断,导致做大量的重复工作.针对这类问题,可以有两种解决方案:延迟加载和预先加载. 基于浏览器功能的探测: function addHandler(ele,eventType,hadler){ if(ele.addEventListener){ ele.addEventListener(eventType,handler,false); }else { //IE ele.attachEvent('on'+eventType,h

PostgreSQL使用函数的多表关联视图在排序时的性能问题

一.问题描述 近日PostgreSQL的某个表的记录数由万级增加到一百万级(设计能力是一亿)时,建立在该表之上的某个多表关联VIEW的查询性能急剧变慢(大约从10ms级跃升到100s级).经分析查询计划,发现瓶颈在于排序用时很长:而排序用时的诱因是什么?在排除掉一个个其它因素后,发现是VIEW定义中使用了函数(非内部函数,特此说明).在将自定义函数更改为等效的子查询或连接查询时,性能得到很好的改善. 因为实际的表.VIEW.函数都过于复杂,为描述及重现问题的关键,以下将表.VIEW.函数等都进行

[转] 剖析 epoll ET/LT 触发方式的性能差异误解(定性分析)

http://blog.chinaunix.net/uid-17299695-id-3059078.html PS:Select和Poll都是水平触发,epoll默认也是水平触发 ET模式仅当状态发生变化的时候才获得通知,这里所谓的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用ET模式,需要一直read/write直到出错为止,很多人反映为什么采用ET模式只接收了一部分数据就再也得不到通知了,大多因为这样;而LT模式是只要有数据没有处理就会一直通知下去的.    LT(leve