C#是强类型语言,好的编程习惯应该尽量避免类型的转换。但是很多时候我们很难避免需要将一个类型强制转换为另外一个类型,例如很多函数都是以Object对象作为参数的,这个时候就需要类型的向下转换。
1.使用is或者as操作符,是安全的不会抛出异常,运行时也会更加的高效。is或者as操作符永远不会执行用户自定义的类型转换,只有在转换类型匹配的情况下,转换才会成功。在转换过程中,也不会创建新的对象来实现转换。
public class SecondType
{
private MyType _value;
// other details elided
// Conversion operator.
// This converts a SecondType toa MyType
public static implicit operator MyType( SecondType t )
{
return t._value;
}
}
// o is a SecondType:
object o = Factory.GetObject( );
// 因为O不是SecondType
//由于as不会进行用户自定义转换,检查转换类不匹配,所以转换会失败;
MyType t = o as MyType;
// Version three:下面这个情况转换会成功
SecondType st = o as SecondType;
try {
MyType t;
t = ( MyType ) st; //调用用户自定义的转换,转换会成功
if ( t != null )
{
// work with T, it's a MyType.
} else
{
// Report a null reference failure.
}
} catch
{
// report the failure.
}
3. as不能用来转换值类型,因为值类型不能为null,但是可以用is来检测是不是对应的值类型。
4.foreach循环中,需要用cast来支持值类型和引用类型,用于 IEnumerator.Current返回的是System.Object类型,所以也是无法在foreach中执行用户自定转换的。