这可能是一个奇怪的问题,但我想知道如何实现。
考虑以下代码段(出于任何原因,我决定将其插入参考类型的数组中,而不是仅创建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
在数组那个位置指向...的位置
答案 0 :(得分:2)
.Net的IL语句框值类型为@ResponseBody
。
框操作执行以下操作:
原始值类型与此引用无关。当它超出范围时,它将丢失,但是引用将一直保留到垃圾回收为止。