背景:我为一个学校项目编写了一个.NET编译器(非常类似于C#)。我目前试图添加的功能之一是在方法内调用递归。CIL(MSIL)实例方法中的尾调用递归
更多信息:在CIL中,“this”被传递给实例方法,就好像它只是另一个参数。因此,访问静态方法的第一个参数时,您将发出ldarg.0,但访问实例方法的第一个参数,则会发出ldarg.1,并在实例方法中访问“this”,您将发出ldarg.0 。 (实例方法与我想象中的扩展方法更相似。)
问题:你可以使用starg.0设置“this”而没有任何副作用吗?
为什么会出现这样的问题:方法是否是实例方法是通过MethodBuilder设置的,这是一个黑盒子。尽管“this”看起来和其他任何争论一样,但我知道一些JIT编译器会分别跟踪“this”并根据这个值改变它们的行为。如果在实例方法中设置“this”时存在副作用,那么我该如何避免它们?
虽然这是一个有趣的问题,但我想补充一点,你问的是我认为会成为一个特例的情况:只有在不同的类实例上调用当前方法时,您的问题才重要。按照你描述的方式,不同的方式是不可能的,使用相同的'this'来调用当前的方法并不需要修改参数0. – hvd 2012-02-09 00:03:38