C#是一种强类型的语言。在编程的过程中,我们都不可避免的会碰到类型转换的问题。这时,我们有两个选择:使用as操作符,或者使用强制类型转换。更保险的做法,首先使用is测试一下转换能否成功,然后再用as或强制类型转换。
正确的做法是,尽可能地使用as操作符,因为相当于强制类型转换来说,as更加安全,也更加高效。不过,as和is操作符都不会执行任何用户自定义的转换,它们仅当运行时类型符合目标类型时才能转换成功,也不会在转换时创建新的对象。
//Version one object castObj = Factory.GetObject();//return a MyType object MyType myType = castObj as MyType; if (null != myType) { } //Version two object castObj = Factory.GetObject();//return a MyType object try { MyType myType; myType = (MyType)castObj; if (null != myType) { //... } } catch(InvalidCastException ex) { //... }
1.使用as操作符,仅需要对转换后的对象是否为null进行判断即可;但是强制类型转换,除了由于可能出现转换异常,需要添加try...catch以外,还需要对转换后的结果进行null判断。相较而言,使用as更加易读,高效,安全。
特别强调的是,用户自定义的转换操作符仅能操作于对象的编译期类型,而不是运行时类型。
但是,as操作符也不是万能,既然有强制类型转换的存在,那么必然有它的用武之地。
2.as操作符并不能用于值类型转换,因为值类型永远不可能为null。所以碰到值类型转换问题,我们仍应该使用强制类型转换,并且可以用is操作符判断,来避免抛出异常。
object castObj = Factory.GetValue();//return an int value int intValue = 0; if (castObj is int) { intValue = (int)castObj; }
注意,仅当不能使用as进行转换时,才应该使用is操作符。否则,is就是多余的。
3.foreach使用强制类型转换将对象转成循环中将要使用的类型。使用强制类型转换,这样就可以同时来支持值类型和引用类型。不过,我们在使用foreach的时候,也会碰到循环中抛出InvalidCastException异常的现象。