ラッパーは「ボックス」です。ボックスのガベージ コレクションについて -グラベージ コレクターに関する限り、違いはありません。ボックスは、他のオブジェクトとまったく同じルールと処理で収集されます。
ただし、値型がメソッド ( など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();
}
ILがあります:
.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