C# as与cast的比较
可能重复:C# as与cast的比较,c#,.net,C#,.net,可能重复: 任何人都可以在“铸态”和“铸态”之间进行比较?如果要铸态的对象不是请求的类型,则直接铸态将失败。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
-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”模式:
因为如果强制转换失败,您将抛出NullReferenceException而不是ClassCastException。这可能会导致您追查某物
为空的原因,而实际上它不是空的!更丑陋但更好的代码
((SomeType)something).Foo();
当
something
引用的对象无法转换为SomeType
时,将引发ClassCastException;当something
为null时,将引发NullReferenceException。执行显式强制转换与使用as运算符在三个主要方面不同
as操作员
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...
}
请参阅[直接播放与“作为”操作员?()。第2点不正确。您也可以将其用于可空值类型。从这里的一个答案中逐字复制而不带属性:+1我通常的建议是:如果您正在执行“as”,那么下一行应该是空检查。@Simon:这一点很好。我想这是我通常做的,但我从来没有把它简化为那个简单的陈述。
CastingType resultVar = sourceVar as CastingType;
if (resultVar == null)
{
//Handle null result here...
}
else
{
// Do smth with resultVar...
}