3

ValueType クラスの MSDN リンクからの引用

値型がオブジェクトのように振る舞う必要がある場合、値型を参照オブジェクトのように見せるラッパーがヒープに割り当てられ、値型の値がそこにコピーされます。ラッパーがマークされているため、値の型が含まれていることがシステムに認識されます。

これは、「integerVariable.ToString();」のようにコーディングした場合を意味します。作成されたラッパー オブジェクトは、このメソッドを使用できるようにし、同様に System.Object の他のすべてのメソッドを使用できるようにします。

この理解は正しいでしょうか?

これらのオブジェクトは「通常の」オブジェクトとどう違うのですか?

そのようなオブジェクトのガベージ コレクションは異なりますか? はいの場合、どのように?

前もって感謝します。

4

2 に答える 2

6

ラッパーは「ボックス」です。ボックスのガベージ コレクションについて -グラベージ コレクターに関する限り、違いはありません。ボックスは、他のオブジェクトとまったく同じルールと処理で収集されます。

ただし、値型がメソッド ( など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

于 2009-01-06T10:25:02.940 に答える
1

はい、その理解は正しいです。

これらのオブジェクトは、CLR の「通常の」オブジェクトと同じです。

これらのオブジェクト (値の型をラップするため「ボックス」とも呼ばれます) は他のオブジェクトとまったく同じであるため、ガベージ コレクターも同じです。

于 2009-01-06T10:17:25.967 に答える