在下面的示例中,我在值类型 ( ) 上调用虚拟方法int
:
namespace ShortTest
{
class Program
{
static void Main(string[] args)
{
int i = 42;
i.ToString();
((object)i).ToString();
}
}
}
查看 Reflector 中生成的 CIL,我可以看到以下两个调用的代码:
.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
...
该this
参数在第一种情况下是指向 int 的托管指针,在第二种情况下是对装箱的引用int
(即,指向具有标头字段和 int 字段的对象的指针)。
由于两个调用(int
实现ToString()
)使用相同的方法,这如何工作?该System.Int32::ToString()
方法使用ldind.i4
指针this
来检索int
' 值,因此它应该int
在第一种情况下获取 ' 值,但在第二种情况下它应该获取装箱int
的第一个字段(标题)的值:
L_0000: ldarg.0
L_0001: ldind.i4
...