C#是一种强类型语言。很多情况下,我们都要进行类型转换(比如传递函数参数的时候),类型转换的方式有两种,一是使用C#提供的as操作符,一是沿用以前的cast方式。相比之下,as操作符不仅更加安全,不会抛出异常,而且对于程序的运行来说效率更高。
★ 例如,我们想把一个object类型的变量转换为MyType类型,使用as操作符这样写:
object o = Factory.GetObject( );
// Version one:
MyType t = o as MyType;
if ( t != null )
{
// work with t, it's a MyType./
}else
{
// report the failure.
}
使用强制类型转换这样写:
object o = Factory.GetObject( );
// Version two:
try {
MyType t;
t = ( MyType ) o;
if ( t != null )
{
// work with T, it's a MyType
}
else
{
// Report a null reference failure.
}
}
catch
{
// report the conversion failure.
}
由上可见,使用as操作符书写的代码更加简洁清楚。
★ 使用as和cast在基类和派生类之间转换也有不同,定义两个类,基类Father和派生类Son,试验如下——
1)以下代码抛出异常
Father f = new Father();
object rr = f;
Son s = (Son)f;
2)以下代码无异常,但s为null
Father f = new Father();
object rr = f;
Son s = f as Son;
3)以下代码成功完成转换
Father f = new Son();
object rr = f;
Son s = f as Son;
4)以下代码同上,成功转换
Father f = new Son();
object rr = f;
Son s = (Son)f;
★ 但是as操作符不能用于值类型的变量,如下面的写法是错误的:
object o = Factory.GetValue( );
int i = o as int; // Does not compile
★ 再说is关键字。is是判断变量是否为一个类型的操作符,通常as无法使用时才使用is。比如:
object o = Factory.GetValue( );
int i = 0;
try
{
i = ( int ) o;
}
catch
{
i = 0;
}
如下is用法就是多余的:
object o = Factory.GetObject( );
MyType t = null;
if ( o is MyType )
t = o as MyType;
★ 另外:今天在CSDN上看到有人贴了TryParse和Parse的效率比较问题(10倍左右),TryParse方法主要是.Net2.0提供的,而Effective C#主要针对1.X版本,没有提及。