Item 3: Prefer the is or as Operators to Casts(选择is或者as操作符而不是做强制类型转换)
C#是一种强类型语言。我们应该尽量避免进行强制的类型转换,不必要的类型转换对代码性能影响较大。
- as和is操作符比强制转换更为安全和高效,不能对用户自定义的转换进行操作。它们只是简单的比较运行时的被转换类型同目标类型是否相匹配。它们永远不会为转换而新建object.
as和强制转换二者最大的不同在于对待用户自定义转换的方式。is和as在运行时检验类型是否可以转换,它们不会做任何其他的操作。如果被转换的类型不是特定的类型或其子类则转换失败。而显式类型转换则会进行转换操作将其强制转换为要求类型。这经常会造成数据丢失,例如数据类型之间的转换。 - as不适用于值类型
语句:int i = o as int; //不能通过编译
应该如果o不是Int类型时,i是值类型而永远不可能为null,所以你无论放什么值都会被理解为一个不合理的值。因此这里建议使用强制转换(鉴于强制转换可能会抛异常,必须使用Try和Catch处理异常)。 - as和is最后不要同时使用
object o = Factory.GetObject();
MyType t = null;
if (o is MyType)
t = o as MyType;object o = Factory.GetObject();
MyType t = t = o as MyType;
if (t != null)
{
//todo
} - Foreach中的类型转换
Foreach循环时,循环的变量可能是值类型,也可能是引用类型,类型转换用什么好呢?
上面提到,如果是值类型,使用as可能有问题,因此,foreach使用强制转换来循环集合内的元素。这样,不管元素是什么类型,都可以定义相同的操作行为。由于使用强制类型,因此foreach需要处理类型强制转换时抛出的异常。
在oo设计中我们应当尽量避免类型转换,但是有时候这是无法避免的。这时应当尽量使用is和as来将你的意图表示清晰。不同的强制类型转换有不同的规则。is和as在大部分的情况下都是正确的选择,而且它们只在目标类型转换正确的时候才起作用。相比之下显式类型转换可能会在你意想不到的地方成功或者失败,这将为你的程序带来一些负作用。