关于c#:as和cast之间的比较

the comparison between as and cast

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Direct casting vs 'as' operator?

有人能比较as和cast吗?


如果要强制转换的对象不是所请求的类型,则直接强制转换将失败。as转换将返回空值。例如:

1
2
object obj = new object();
string str = (string)obj; // Throws ClassCastException

然而:

1
2
object obj = new object();
string str = obj as string; // Sets str to null

当要强制转换的对象是您要强制转换的类型时,两种语法的结果都相同:对象被成功强制转换。

请特别注意,您应该避免使用"as and invoke"模式:

1
(something as SomeType).Foo();

因为如果强制转换失败,您将抛出一个NullReferenceException而不是ClassCastException。这可能会导致你追查为什么something是空的,而实际上不是空的!更丑,但更好的代码

1
((SomeType)something).Foo();

something引用的对象无法转换为SomeType时,将引发ClassCastException;当something为空时,将引发NullReferenceException。


"as"不引发异常,如果强制转换失败,则返回空值。

其工作原理与此代码类似:

1
2
3
4
5
6
7
8
if (objectForCasting is CastingType)
{
   result = (CastingType)objectForCasting;
}
else
{
   result = null;
}

好的做法是使用as语句后使用检查是否为空:

1
2
3
4
5
6
7
8
9
10
CastingType resultVar = sourceVar as CastingType;

if (resultVar == null)
{
   //Handle null result here...
}
else
{
   // Do smth with resultVar...
}


执行显式强制转换与使用as运算符有三个主要方面的不同。

作为操作员…

  • 如果要转换的变量不是请求的类型,也不在其继承链中,则返回空值。另一方面,演员会抛出一个例外。
  • 只能应用于转换为引用类型的引用类型变量。
  • 无法执行用户定义的转换,例如显式或隐式转换运算符。强制转换可以执行这些类型的转换。