对象在C#铸造

问题描述:

是什么对象在C#铸造

LinkButton lb = (LinkButton)ctl; 

LinkButton lb = ctl as LinkButton; 

我使用的第一个尝试,它给了我错误的区别,以及利弊, 然后我试着另一个关键字为,它工作得很好。

非常感谢您。

+0

已经看到了这个。必须重复。 :) – 2009-12-06 20:04:51

+0

可能重复的[直接铸造'作为'运营商?](http://*.com/questions/132445/direct-casting-vs-as-operator) – 2013-05-26 20:41:35

第一个是显式演员,第二个是转换。如果as关键字的转换失败,它将仅返回null而不是抛出异常。

这是为每一个文档:

注意上面所链接的文档时,他们陈述as关键字不支持用户定义的转换。 +1 Zxpro :)这是一个用户定义的转换是什么:

User-Defined Conversions Tutorial

+2

我相信这也是相当重要的提及'as'运算符不执行任何用户定义的转换(隐式或显式)。 – 2009-12-06 13:19:11

我认为,使用第一种方法铸造抛出,如果它不能正常投的对象异常(努力铸就错误的类型),而使用as关键字将简单地将该变量设置为null,如果它无法正确转换。

所以一定要确保,如果您使用的关键字转换,你检查

if(lb == null) 
    return null; // or throw new Exception() 

,如果你使用()演员,你

try 
{ 
    LinkButton lb = (LinkButton)ctl; 
} 
catch(InvalidCastException ex) 
{ 
    //TODO: Handle Exception 
} 
+1

哈哈,乌鸦T机器人,我喜欢这个名字。 – AaronLS 2009-12-06 05:19:06

围绕着它的第二个被称为安全的转换,而不是抛出异常,将把“空”放到你的变量中。所以它不会正常工作,但设置您LinkButton lb为null

是我对使用as运营商对直接投平常的指导如下:

  1. 如果演员必须成功(即,如果演员阵容失败,那么将继续发生错误),请使用直接投射。
  2. 如果演员阵容可能失败并且需要对其进行编程检测,请使用as运算符。

以上对于参考类型是正确的。对于值类型(如boolint),as不起作用。在这种情况下,您将需要使用is检查做了“安全投”,像这样:

int y; 
if (x is int) 
{ 
    y = (int)x; 
} 
else 
{ 
    // ... 
} 

我不建议追赶InvalidCastException,因为这通常是一个程序员错误的符号。改为使用上面的指导。