is和as优于强制性类型转换

来源:互联网 发布:linux oracle rac搭建 编辑:程序博客网 时间:2024/04/30 05:38

我们经常要用到类型转换,但是对于如何选择转换的方式却并不一定都了解.

比如

(1)

object o1 = new MyObj1();

MyObj2 o2 = o1 as MyObj2;

if(o2!=null)

{

  //other code here...

}

else

{

  //failed to cast...

}

(2)

object o1= new MyObj1();

try

{

   MyObj2 o2 = (MyObj2)o1;

   if(o2!=null)

  {

    //other code here

  }

else

  {

    //...

  }

}

catch

{

   //throw;

}

如果我们用as来转换的话,除非MyObj1和MyObj2有继承关系,否则转换将失败,而用强制类型转换则不一定,只要MyObj1类有自定义类型转换函数MyObj2,则可能转换成功,不过上述代码(2)也不会成功,因为强制类型转换针对的是编译时类型,而对于编译时类型o1为object类型,并没有自定义转换为MyObj2的函数.

as和强制类型转换的区别在于,as不会在意是否存在自定义类型转换函数,它针对的时运行时类型,所以as转换成功的可能性只有2者具有同一运行时类型,即2者具有相互继承关系;而强制类型转换会执行自定义转换函数,并且它针对的是编译时类型,所以要注意(2)类似的错误.

还有as不能用于Int(float)等值类型.

 

我们常用到的foreach用的是强制类型转换,因为它需要能对Int等类型支持.

 

is的原理与as类似,不过它返回bool类型,is可与强制类型转换搭配使用,可避免转换异常,但最好不要把is和as搭配,实际上is也做了as的转换操作,这样会影响效率.

 

原创粉丝点击