为什么拳击参考类型?

时间:2013-10-23 18:08:57

标签: c# .net clr boxing

ECMA-335,1.8.2.4指定可盒装类型包括引用类型(不包括托管指针/ byrefs)和通用参数。

拳击参考类型的目的是什么?与未装箱的参考对象相比,盒装参考对象的功能和内存表示是否有任何不同?

2 个答案:

答案 0 :(得分:5)

装箱参考类型参考没有任何逻辑错误。这只是一个无操作,没有任何改变。

但是,对于.NET CLR中实现真正的内容,Ecma-335并不总是很好的描述。实现Opcodes.Box的JIT_Box()辅助函数实际上会在要求输入不是值类型的值时抛出InvalidCastException。它期望编译器和抖动知道何时在不必要时抑制装箱转换。他们这样做。

答案 1 :(得分:3)

考虑通用功能:

object MyBox<T>(T value)
{
    return (object)value;
}

这编译为:

ldarg.1     
box         01 00 00 1B 
ret

如果T是引用类型,则此函数的预期行为是无操作,将值装入自身。

装箱一个已知为参考类型的值不太有用,但以与泛型一致的方式指定它是简单且一致的。