《C#高效编程》读书笔记03-推荐使用is或as操作符而不是强制类型转换

时间:2023-03-10 06:32:19
《C#高效编程》读书笔记03-推荐使用is或as操作符而不是强制类型转换

在日常编码中,很多时候都要编写接受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