Сборка мусора для упаковщиков ValueType - PullRequest
3 голосов
/ 06 января 2009

Цитирование по ссылке MSDN для класса ValueType

В тех случаях, когда необходимо, чтобы тип значения вел себя как объект, в куче выделяется оболочка, которая делает тип значения похожим на ссылочный объект, и в него копируется значение типа значения. Оболочка помечена, чтобы система знала, что она содержит тип значения.

Это означает, что когда я кодирую как "integerVariable.ToString ();" созданный объект-обертка позволяет использовать этот метод и аналогично всем остальным методам System.Object.

Правильно ли это понимание?

Чем эти объекты отличаются от «обычных» объектов?

Отличается ли сбор мусора для такого объекта? Если да, то как?

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 06 января 2009

Обертка - это «коробка»; Что касается сборки мусора из ящиков - разница в нет в том, что касается сборщика мусора. Коробка собрана с теми же правилами и правилами, что и для любого другого предмета.

однако, если тип значения переопределяет метод (такой как ToString()), нет необходимости помещать его в коробку для вызова метода. Следовательно, типы значений должны (как правило) переопределять как можно больше методов object; -p

Вы можете увидеть разницу в IL (через отражатель) - так для C #:

static int GetInteger() {return 123;}
static string TestToString() {
    int i = GetInteger(); // to prove no cheating
    return i.ToString();
}
static Type TestGetType() {
    int i = GetInteger(); // to prove no cheating
    return i.GetType();
}

У нас есть ИЛ:

.method private hidebysig static string TestToString() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloca.s i
    L_0008: call instance string [mscorlib]System.Int32::ToString()
    L_000d: ret 
}

.method private hidebysig static class [mscorlib]System.Type TestGetType() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: box int32
    L_000c: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    L_0011: ret 
}

Обратите внимание, что ToString() не включает поле, но GetType() имеет значение L_0007 (поскольку оно не (не может быть) переопределено)

1 голос
/ 06 января 2009

Да, это понимание правильно.

Эти объекты ничем не отличаются от «обычных» объектов в CLR.

Поскольку эти объекты (также называемые «ящиками», потому что они обертывают типы значений) аналогичны любым другим объектам, сборщик мусора такой же.

...