我们经常要用到类型转换,但是对于如何选择转换的方式却并不一定都了解.
比如
(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的转换操作,这样会影响效率.