C#不同的铸造方法--(T)obj与obj为T

本文关键字:obj 方法 | 更新日期: 2023-09-27 17:59:39

可能重复:
铸造与使用';作为';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铸件的正确名称是什么
  • 我如何决定何时使用什么
  • 是否存在任何重大性能问题
  • 关于这个话题,还有什么我应该知道的吗

非常感谢您对此进行研究:)

C#不同的铸造方法--(T)obj与obj为T

如果强制转换无效,第一个("直接"或"C样式"强制转换)将引发异常。这也是对对象执行实际类型转换的唯一方法。(请注意,类型转换与强制转换不同,因为强制转换只会更改变量的类型,而类型转换会为您提供不同类型的对象。)

第二个(没有特定的名称,尽管您可以像在VB.NET中调用的那样将其称为"try-cast")的求值结果为null,而不是抛出InvalidCastException。(由于这种行为,它只适用于引用类型)。

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

只有当预期结果可能无效时,才使用as。否则,请使用第一个。


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

as运算符类似于强制转换操作。但是,如果转换不可能,as将返回null,而不是引发异常。考虑以下表达式:

expression as type

它等效于以下表达式,只是表达式只计算一次。

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

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