int
以下の例では、値型 ( )で仮想メソッドを呼び出します。
namespace ShortTest
{
class Program
{
static void Main(string[] args)
{
int i = 42;
i.ToString();
((object)i).ToString();
}
}
}
Reflector で生成された CIL を見ると、次の 2 つの呼び出しのコードが表示されます。
.locals init ([0] int32 i, ...)
...
L_001a: ldloca.s i
L_001c: call instance string [mscorlib]System.Int32::ToString()
L_0021: pop
L_0022: ldloc.0
L_0023: box int32
L_0028: callvirt instance string [mscorlib]System.Object::ToString()
L_002d: pop
...
パラメーターは、最初のケースでは int へのthis
マネージ ポインターであり、2 番目のケースではボックス化されたint
(つまり、ヘッダー フィールドと int フィールドを持つオブジェクトへのポインター) への参照です。
両方の呼び出し ( int
implements ToString()
) に同じメソッドが使用されるため、これはどのように機能するのでしょうか? このSystem.Int32::ToString()
メソッドはポインタを使用ldind.i4
しての値を取得するため、最初のケースでは の値を取得する必要がありますが、2 番目のケースでは boxedの最初のフィールド (ヘッダー) の値を取得する必要があります。this
int
int
int
L_0000: ldarg.0
L_0001: ldind.i4
...