Тип значения, созданный в стеке, не имеет ссылки на какой-либо объект в куче - нет соответствующего объекта в куче .Это будет создано только в том случае, если тип значения помечен в штучной упаковке - в этом случае все еще не будет никакой связи между этими двумя.
Именно поэтому, когда вы изменяете значение ссылочного типа в штучной упаковке, исходная переменная остается прежней.Всякий раз, когда вы ставите ящик, создается новый объект.
Вот простой метод:
private void TestBoxing()
{
int i = 52;
object io = i;
io = "something else";
}
А вот сгенерированный код IL:
.method private hidebysig instance void TestBoxing() cil managed
{
// Code size 18 (0x12)
.maxstack 1
.locals init ([0] int32 i,
[1] object io)
IL_0000: nop
IL_0001: ldc.i4.s 52
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: box [mscorlib]System.Int32
IL_000a: stloc.1
IL_000b: ldstr "something else"
IL_0010: stloc.1
IL_0011: ret
} // end of method Program::TestBoxing
Как выМожно видеть, что .locals init ([0] int32 i, [1] object io)
- это не что иное, как инициация локальных переменных, одного целого и одного объекта.
(обновление)
Я спрашивал, каков конкретный типссылка в стеке, которая ссылается на объект в куче
Это простая ссылка на объект , аналогичная всем ссылкам на объекты, которые ссылаются на точку в памяти, которая имеет 4указатель байтового типа и 4-х байтовый блок синхронизации, а затем остаток - это столько места, сколько требуется объекту, в нашем случае int требуется 4 байта, поэтому 12 байтов.
(Update2)
ХорошоЯ не думаю, что у него есть имя, это внутренний указатель CLR (32-битный или 64-битный в зависимости от времени выполнения), который не используется вне CLR и не отображается.Как вы уже знаете, он управляется GC, поскольку значение будет изменяться после перемещения объектов в куче после сборки мусора.