如何将临时值类型装箱

时间:2018-10-18 10:09:07

标签: c#

这可能是一个奇怪的问题,但我想知道如何实现。

考虑以下代码段(出于任何原因,我决定将其插入参考类型的数组中,而不是仅创建T数组)

public class HeapScatteredValueList<T> where T : struct
{
    private object[] _list;
    private int _head;

    public HeapScatteredValueList(int maxCapacity)
    {
        _list = new object[maxCapacity];
    }

    public void Add(T item)
    {
        var newHead = _head + 1;
        if (newHead > _list.Length - 1)
        {
            throw new Exception();
        }

        _list[_head++] = item;
    } // The "item" that was copied in to the stack of this function should be destroyed here, what is in the list then?

    public T this[int index] => (T) _list[index];
}

现在,每当我调用此函数时,由于T将是一个值类型,因此我传入的参数将按值(因此是副本)传递。该副本仅应位于Add(T item)的范围内,因此在行_list[_head++] = item上会发生什么? object在数组那个位置指向...的位置

1 个答案:

答案 0 :(得分:2)

.Net的IL语句框值类型为@ResponseBody。 框操作执行以下操作:

  1. 考虑值类型的大小分配内存(加上其他字段-类型对象指针和同步块索引)
  2. 值复制到此新内存
  3. 返回内存的地址,从而成为引用

原始值类型与此引用无关。当它超出范围时,它将丢失,但是引用将一直保留到垃圾回收为止。