C#不同的铸造方式 – (T)obj vs obj为T

可能重复:
使用CLR中的’as’关键字进行转换

我在C#中看到了两种不同的方式。

例如:

MyObj foo = (MyObj) bar; // this is what I see most of the times MyObj foo = bar as MyObj; // I do see this sometimes 
  • 那么,基本的区别是什么?
  • style 1style 2投射的专有名称是什么?
  • 我如何决定何时使用什么?
  • 有任何重大的性能问题吗?
  • 我还应该知道与此主题相关的其他内容吗?

非常感谢您对此进行调查:)

如果演员表无效,第一个(“直接”或“C风格”演员)会抛出exception。 它也是在对象上执行实际类型转换的唯一方法。 (请注意,类型转换与转换不同,因为转换只会更改变量的类型,而类型转换会为您提供*不同类型的对象。)

第二个(没有特别的名称,虽然你可以称之为“试用”,因为它在VB.NET中调用)计算为null 而不是抛出InvalidCastException 。 (由于这种行为,它仅适用于引用类型)。

没有重大的性能问题相互比较。

只有在您希望结果可能无效时才使用。 否则,请使用第一个。


顺便说一句, MSDN可能对您的部分问题有所帮助 :

as运算符就像一个强制转换操作。 但是,如果无法进行转换,则返回null而不是引发exception。 请考虑以下表达式:

 expression as type 

除了表达式只被计算一次之外,它等效于以下表达式。

 expression is type ? (type)expression : (type)null 

请注意, as运算符仅执行引用转换和装箱转换。 as运算符不能执行其他转换,例如用户定义的转换,而应使用转换表达式执行转换。