在日常编码中,很多时候都要编写接受object作为参数的方法,接下来是将这些object转型成特定类型,要么类,要么接口。这时我们有两种选择,使用as操作符,或者使用强制类型转换。
正确的做法是,尽可能使用as操作符,因为相对强制转换来说,as更加安全,也更加高效。
例:
object o = Factory.GetObject();
MyType t = o as MyType;
if(t != null){
//转换成功
}else{
//转换失败
}
强制转换:
object o = Factory.GetObject();
try{
MyType t;
t = (MyType)o;
}catch(InvalidCastException){
//转换失败
}
显然第一种方法更加简单易读。其中并没有try/catch语句,因此也就避免了其带来的开销。
而且强制转换包括框架内建数值转换。例如:long类型强制转换为一个short类型,将会造成部分信息丢失。
需要注意的是,平常常用的foreach方法,也是内建强制类型转换。若使用非类型安全的泛型版本,则有可能会抛出InvalidCastException异常。
is和as也能作为简单的继承类型判断,若一个类型继承自目标类型,那么is操作符将返回true。
public class Child : Father
{
}
Child child = new Child();
bool reuslt = child is Child;//true
bool reuslt = child is Father;//true
var obj = child as Child;//obj not null
var obj = child as Father;//obj not null