C#中的对象转换

Aga*_*rue 12 c#

有什么区别以及它们之间的利弊

 LinkButton lb = (LinkButton)ctl;
Run Code Online (Sandbox Code Playgroud)

 LinkButton lb = ctl as LinkButton;
Run Code Online (Sandbox Code Playgroud)

我尝试使用第一个,它给了我错误,然后我尝试使用关键字的另一个,它工作得很好.

先感谢您.

Aar*_*nLS 15

第一个是显式转换,第二个是转换.如果as关键字转换失败,则只返回null而不是抛出异常.

这是每个的文档:

请注意,在上面的链接文档中,他们声明as关键字不支持用户定义的转换.+1到Zxpro :)这是用户定义的转换:

用户定义的转换教程

  • 我相信提及`as`运算符不执行任何用户定义的转换(隐式或显式)也是非常重要的. (2认同)

bob*_*mcr 8

我使用as操作员与直接投射的通常指导如下:

  1. 如果施法必须成功(即如果施法失败将继续错误),使用直接施法.
  2. 如果演员表可能失败并且需要对此进行编程检测,请使用as运算符.

以上适用于参考类型.对于值类型(如boolint),as不起作用.在这种情况下,您需要使用is支票来进行"安全演员",如下所示:

int y;
if (x is int)
{
    y = (int)x;
}
else
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我不建议尝试捕获InvalidCastException,因为这通常是程序员错误的标志.请使用上面的指导.


Cro*_*bot 5

我相信使用第一种方法进行转换会抛出异常,如果它无法正确转换对象(尝试转换错误的类型),而使用as关键字只会将变量设置为null,如果它无法正确转换它.

因此,请确保如果您使用as关键字强制转换,请检查

if(lb == null)
    return null; // or throw new Exception()
Run Code Online (Sandbox Code Playgroud)

如果使用()强制转换,则用它包围

try
{
    LinkButton lb = (LinkButton)ctl;
}
catch(InvalidCastException ex)
{
    //TODO: Handle Exception
}
Run Code Online (Sandbox Code Playgroud)