我很想知道 C# 中的所有强制转换是否都会导致装箱,如果不是,那么所有强制转换都是成本高昂的操作吗?
示例取自装箱和拆箱(C# 编程指南) http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
int i = 123;
// The following line boxes i.
object o = i;
这一行显然会导致装箱(将 int 类型包装为对象)。
这是一个被认为成本高昂的操作,因为它会产生需要收集的垃圾。
来自 2 种不同类型的引用类型的强制转换怎么样?这样做的代价是多少?可以正确测量吗? (与前面的例子相比)
例如:
public class A
{
}
public class B : A
{
}
var obj = new B();
var obj2 = (A)obj; // is this an "expensive" operation? this is not boxing
我很好奇 C# 中的所有转换是否都会导致装箱。
不会。只有装箱转换才会产生装箱,因此称为“装箱转换”。装箱转换都是从值类型到引用类型的内置转换——要么是值类型继承的类,要么是它实现的接口。 (或者通过协变或逆变引用转换到与其实现的接口兼容的接口。)
所有转换都是成本高昂的操作吗?
不会。标识转换的成本为零,因为编译器可以完全消除它们。
隐式和显式引用转换的成本是多少?
隐式引用转换都是零成本。编译器可以完全消除它们。也就是说,从 Giraffe 转换为其基本类型 Animal,或者从 Giraffe 转换为其实现的接口类型 IAmATallMammal,都是免费的。
显式引用转换涉及运行时检查以验证该引用确实引用了所需类型的对象。
运行时检查是否“昂贵”取决于您的预算。
这个成本可以正确衡量吗?
当然。确定哪些资源与您相关(例如时间),然后用秒表仔细测量您的时间消耗。
一个你没有问但可能应该问的问题:
最昂贵的转换是什么?
用户定义的转换只不过是方法调用的语法糖;与任何方法一样,该方法可能需要任意长的时间。
动态转换在运行时再次启动编译器;编译器可能需要任意长的时间来执行类型分析,具体取决于您选择向其抛出的分析问题的难度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)