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操作员

  • 如果要转换的变量不是请求的类型,也不存在于其继承链中,则返回null。另一方面,强制转换会抛出异常
  • 只能应用于转换为引用类型的引用类型变量
  • 无法执行用户定义的转换,例如显式或隐式转换运算符。强制转换可以执行这些类型的转换 “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...
    }
    

    请参阅[直接播放与“作为”操作员?()。第2点不正确。您也可以将其用于可空值类型。从这里的一个答案中逐字复制而不带属性:+1我通常的建议是:如果您正在执行“as”,那么下一行应该是空检查。@Simon:这一点很好。我想这是我通常做的,但我从来没有把它简化为那个简单的陈述。
    CastingType resultVar = sourceVar as CastingType;
    
    if (resultVar == null)
    {
       //Handle null result here...
    }
    else
    {
       // Do smth with resultVar...
    }