C#不同的铸造方式 - (T)obj vs obj as T

时间:2011-06-19 06:20:22

标签: c# .net casting

  

可能重复:
  casting vs using the 'as' keyword in the CLR

我在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施法的专有名称是什么?
  • 我如何决定何时使用?
  • 是否有任何重大的性能问题?
  • 我还应该知道与此主题相关的其他内容吗?

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

1 个答案:

答案 0 :(得分:27)

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

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

相互之间没有重大的性能问题。

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


顺便提一句,MSDN might be helpful部分问题:

  

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

null
     

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

expression as type
     

请注意,expression is type ? (type)expression : (type)null 运算符仅执行引用转换和装箱转换。 as运算符无法执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行转换。