实例方法调用时,默认第一个参数是'this',比如a.Method()相当于a.Method(this),这个this是指向堆中a的地址的值,把a.Method()看成Method(this)。this是b,c..都行,看起来像是b.Method(),c.Method().把Method()看成所有实例都可调用的方法(实际上是把实例当this传给方法了),用IL写:
.assembly extern mscorlib{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
.ver 2:0:0:0
}
.assembly iltest {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void mmain() il managed
{
.entrypoint
newobj instance void ccc::.ctor()
dup
ldc.i4 55
call instance void zzz::aaa(int32)
ldc.i4 4
add
ldobj int32
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
.method private hidebysig instance void aaa(int32)
{
ldarg.0
ldc.i4 4
add
ldarg.1
stobj int32
ret
}
}
.class private auto ansi ccc extends [mscorlib]System.Object
{
.field private int32 i
.method public hidebysig specialname rtspecialname instance void .ctor() il managed
{
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ldarg.0
ldc.i4.2
stfld int32 ccc::i
ret
}
}
上面的Main方法看起来像ccc.aaa(55)吧,或者当作aaa(ccc,55)。
输入结果是:55
不知道自己在干啥,纯属娱乐
