as和cast之间的比较

可能重复:
直接投射vs'as'运营商?

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


如果所铸造的物体不是所要求的类型,则直接投射将失败。 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为空的原因, something事实上并非如此! 丑陋的,但更好的代码

((SomeType)something).Foo();

something引用的对象不能转换为SomeType时会抛出ClassCastException,而当something为null时则抛出NullReferenceException异常。


“as”不抛出异常并在投射失败时返回null。

它的工作原理与此代码类似

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

好的做法是在使用as语句之后使用检查null:

CastingType resultVar = sourceVar as CastingType;

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

执行明确的转换与在三个主要方面使用as运算符不同。

as运算符...

  • 如果被转换的变量不是所请求的类型,也不存在于其继承链中,则返回null。 另一方面,演员阵容会抛出异常。
  • 只能应用于转换为引用类型的引用类型变量。
  • 不能执行用户定义的转换 - 例如显式或隐式转换运算符。 演员阵容可以执行这些类型的转换。
  • 链接地址: http://www.djcxy.com/p/73731.html

    上一篇: the comparison between as and cast

    下一篇: Which is the best practice in C# for type casting?