tl;dr:拳击不是“你如何创建参考”;它是“您如何为不期望该确切类型的消费者打包原始值类型”。
在 .NET 中,引用类型是堆上的类实例。 int 或 double 之类的值类型只是字节:32 位 int 只是四个字节的 0 和 1。当你把它放进去时,说一个System.List(老式的前通用类型,Granpaw 在杂货店里删掉了),然后把它拿出来,如果你调用 GetType,编译器怎么知道该怎么做() 在上面?它只有四个字节......什么?谁知道?如果它在List 中存储了一个指针,它将有一个指向四个字节的指针...谁知道呢?
在您自己的方法中,生成的代码知道您的变量是什么。定期强类型检查。但是,当您将变量的值发送给只知道他在期待Object 的其他人时,这不起作用。
因此,当您将int 添加到List 或将其传递给以Object 作为参数的函数时,编译器必须向其中添加一些信息,以便其他人知道他得到了什么。
所以“装箱”意味着将一个非引用值打包到一个可以被视为Object 实例的对象中。对于普通的ref 参数,这不是必需的,因为类型是完全已知的:为函数内部生成的代码不必准备处理任何任意引用类型。它知道它正在获取(例如)一个指向整数的指针,这就是它所要获取的全部内容。 Boxing 提供了在这种情况下不需要的功能,因此编译器不会浪费用户的周期。
装箱并不是唯一引用(在术语的最广泛意义上)例如double 的方式。相反,装箱是将double 视为可以存储在System.List 中的对象的唯一方法:它必须在堆上,必须可转换为Object,必须具有运行时类型信息等。
对于以下情况,所有调用者或被调用者都需要64 zeroes and ones某处的地址:
void f(ref double d) { d *= 2; }