as和cast之间的比较

时间:2010-11-16 06:44:43

标签: c# .net

  

可能重复:
  Direct casting vs 'as' operator?

任何人都可以对as和cast进行比较吗?

3 个答案:

答案 0 :(得分:11)

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

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

然而:

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

当正在转换的类型 时,任何语法的结果都是相同的:对象已成功转换。

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

(something as SomeType).Foo();

因为如果转换失败,您将抛出NullReferenceException而不是ClassCastException。这可能会导致您追逐something为空的原因,而实际上并非如此!更丑陋但更好的代码

((SomeType)something).Foo();

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

答案 1 :(得分:1)

“as”不抛出异常,如果强制转换失败则返回null。

它与以下代码类似:

if (objectForCasting is CastingType)
{
   result = (CastingType)objectForCasting;
}
else
{
   result = null;
}

好的做法是在使用as语句后使用check for null:

CastingType resultVar = sourceVar as CastingType;

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

答案 2 :(得分:0)

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

as as operator ...

    如果要转换的变量不是所请求的类型,并且在其继承链中存在,则
  1. 返回null。另一方面,演员会抛出异常。
  2. 只能应用于转换为引用类型的引用类型变量。
  3. 无法执行用户定义的转换 - 例如,显式或隐式转换运算符。演员可以执行这些类型的转换。