浏览:2522008-03-09 11:06   来自LeeT      :

实例方法调用时,默认第一个参数是'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

不知道自己在干啥,纯属娱乐

楼主

你还不是小组成员,加入小组以后才能发布新主题!
> 返回“CLR基础研究小组”


其他话题

1 30704