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运算符...