对象在C#铸造
是什么对象在C#铸造
LinkButton lb = (LinkButton)ctl;
和
LinkButton lb = ctl as LinkButton;
我使用的第一个尝试,它给了我错误的区别,以及利弊, 然后我试着另一个关键字为,它工作得很好。
非常感谢您。
第一个是显式演员,第二个是转换。如果as
关键字的转换失败,它将仅返回null
而不是抛出异常。
这是为每一个文档:
注意上面所链接的文档时,他们陈述as
关键字不支持用户定义的转换。 +1 Zxpro :)这是一个用户定义的转换是什么:
我相信这也是相当重要的提及'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
}
哈哈,乌鸦T机器人,我喜欢这个名字。 – AaronLS 2009-12-06 05:19:06
围绕着它的第二个被称为安全的转换,而不是抛出异常,将把“空”放到你的变量中。所以它不会正常工作,但设置您LinkButton lb
为null
是我对使用as
运营商对直接投平常的指导如下:
- 如果演员必须成功(即,如果演员阵容失败,那么将继续发生错误),请使用直接投射。
- 如果演员阵容可能失败并且需要对其进行编程检测,请使用
as
运算符。
以上对于参考类型是正确的。对于值类型(如bool
或int
),as
不起作用。在这种情况下,您将需要使用is
检查做了“安全投”,像这样:
int y;
if (x is int)
{
y = (int)x;
}
else
{
// ...
}
我不建议追赶InvalidCastException
,因为这通常是一个程序员错误的符号。改为使用上面的指导。
已经看到了这个。必须重复。 :) – 2009-12-06 20:04:51
可能重复的[直接铸造'作为'运营商?](http://*.com/questions/132445/direct-casting-vs-as-operator) – 2013-05-26 20:41:35