たとえば、私はC#で次のコードを持っています
int x = 0;
x.ToString();
これは内部的に x のボックス化を行いますか? これがビジュアルスタジオから起こっているのを見る方法はありますか?
たとえば、私はC#で次のコードを持っています
int x = 0;
x.ToString();
これは内部的に x のボックス化を行いますか? これがビジュアルスタジオから起こっているのを見る方法はありますか?
この特定のケースでは、System.Int32
(an int
) を使用しています。その型はToString
, Equals
andGetHashCode
を再定義するので、ボクシングはありません。
あなたが持っているものをstruct
再定義しないa を使用する場合は、 toです。制約付きの定義:ToString
constrained callvirt
System.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()