質問

ValueTypeクラスのMSDNリンク

  

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

これは、" integerVariable.ToString();"作成されたラッパーオブジェクトは、このメソッドと同様にSystem.Objectの他のすべてのメソッドを使用できます。

  

この理解は正しいですか?

     

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

     

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

事前に感謝します。

役に立ちましたか?

解決

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

ただし、値型がメソッド( 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 で((オーバーライドできない)

他のヒント

はい、理解が正しいこと。

これらのオブジェクトは、CLRの「通常の」オブジェクトと変わりません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top