Обертка - это «коробка»; Что касается сборки мусора из ящиков - разница в нет в том, что касается сборщика мусора. Коробка собрана с теми же правилами и правилами, что и для любого другого предмета.
однако, если тип значения переопределяет метод (такой как 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
(поскольку оно не (не может быть) переопределено)