我一直在试图理解这一段,但是由于某种原因我无法将其虚拟化,有人请对其进行详细说明:
最佳答案
为了装箱一个int,您需要在堆上创建一个足够大的对象,以容纳该结构保存的所有数据。在堆上分配一个新对象意味着GC会找到一个位置,并在其生命周期内和生命周期之后对GC进行清理/移动。这些操作虽然不是很昂贵,但也不便宜。
要取消对值类型的装箱操作,可以这么说是取消对指针的引用。您只需要查看引用(即您拥有的object
),即可找到实际值的位置。在内存中查找值非常便宜,这就是为什么该段说“拆箱”很便宜的原因。
更新:
尽管通常将取消装箱的值类型在取消装箱后立即复制到其他位置,但情况并非总是如此。考虑以下示例:
public struct MyStruct
{
private int value = 42;
public void Foo()
{
Console.WriteLine(value);
}
}
static void Main()
{
object obj = new MyStruct();
((MyStruct)obj).Foo();
}
MyStruct
被装箱到obj
中,但是当取消装箱时,它永远不会被复制到任何地方,只需在其上调用一个方法即可。同样,您可以从结构中拉出属性/字段并仅复制其中的一部分,而无需复制整个内容。这可能看起来有些虚构,但仍不完全荒谬。就是说,正如您的报价所暗示的那样,在拆箱后,仍然有可能复制该结构。关于c# - 从对象中取消装箱值类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10150385/