5

たとえば、私はC#で次のコードを持っています

int x = 0;
x.ToString();

これは内部的に x のボックス化を行いますか? これがビジュアルスタジオから起こっているのを見る方法はありますか?

4

2 に答える 2

7

この特定のケースでは、System.Int32(an int) を使用しています。その型はToString, EqualsandGetHashCodeを再定義するので、ボクシングはありません。

あなたが持っているものをstruct再定義しないa を使用する場合は、 toです。制約付きの定義:ToStringconstrained callvirtSystem.Object.ToString()

callvirt メソッド命令が制約付きの thisType によってプレフィックスされている場合、命令は次のように実行されます。

  • thisType が値型であり、thisType がメソッドを実装する場合、ptr は、thisType によるメソッドの実装のために、メソッド呼び出し命令への「this」ポインターとして変更されずに渡されます。
  • thisType が値型であり、thisType がメソッドを実装していない場合、ptr は逆参照され、ボックス化され、'this' ポインターとして callvirt メソッド命令に渡されます。

したがって、値の型が実装されToStringている場合はボクシングではなく、実装されていない場合はボクシングがあります...興味深い。知りませんでした。

GetType()値の型で定義されているような非仮想メソッドSystem.Objectの場合、常にボックス化されます。以下でテストしました:

5.GetType();

結果の IL コード:

IL_0001: ldc.i4.5
IL_0002: box [mscorlib]System.Int32
IL_0007: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
于 2013-09-04T13:52:04.400 に答える