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 1
和style 2
铸件的正确名称是什么- 我如何决定何时使用什么
- 是否存在任何重大性能问题
- 关于这个话题,还有什么我应该知道的吗
非常感谢您对此进行研究:)
如果强制转换无效,第一个("直接"或"C样式"强制转换)将引发异常。这也是对对象执行实际类型转换的唯一方法。(请注意,类型转换与强制转换不同,因为强制转换只会更改变量的类型,而类型转换会为您提供不同类型的对象。)
第二个(没有特定的名称,尽管您可以像在VB.NET中调用的那样将其称为"try-cast")的求值结果为null
,而不是抛出InvalidCastException
。(由于这种行为,它只适用于引用类型)。
相互比较没有重大性能问题。
只有当预期结果可能无效时,才使用as
。否则,请使用第一个。
顺便说一句,MSDN可能对您的部分问题有所帮助:
as
运算符类似于强制转换操作。但是,如果转换不可能,as将返回null
,而不是引发异常。考虑以下表达式:expression as type
它等效于以下表达式,只是表达式只计算一次。
expression is type ? (type)expression : (type)null
请注意,
as
运算符仅执行引用转换和装箱转换。as
运算符不能执行其他转换,例如用户定义的转换,而应该使用强制转换表达式来执行。