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

Moo*_*oon 11 .net c# casting

可能重复:
使用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
Run Code Online (Sandbox Code Playgroud)
  • 那么,基本的区别是什么?
  • 什么是style 1style 2铸造的专有名称?
  • 我如何决定何时使用什么?
  • 有任何重大的性能问题吗?
  • 我还应该知道与此主题相关的其他内容吗?

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

Meh*_*dad 27

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

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

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

as仅当您希望结果可能无效时才使用.否则,请使用第一个.


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

as运营商就像是一个转换操作.但是,如果转换不可能,则返回null而不是引发异常.请考虑以下表达式:

expression as type
Run Code Online (Sandbox Code Playgroud)

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

expression is type ? (type)expression : (type)null
Run Code Online (Sandbox Code Playgroud)

请注意,as运算符仅执行引用转换和装箱转换.该as操作者不能执行其他转换,如用户定义的转换,这应该代替使用通过转换表达式来执行.