背景:我正在为一个学校项目编写一个 .NET 编译器(非常类似于 C#)。我目前尝试添加的功能之一是方法内的尾调用递归。
更多信息:在 CIL 中,“this”被传递给实例方法,就好像它只是另一个参数一样。因此,访问静态方法的第一个参数,您将发出 ldarg.0,但访问实例方法的第一个参数,您将发出 ldarg.1,而在实例方法中访问“this”,您将发出 ldarg.0 . (实例方法比我想象的更类似于扩展方法。)
问题:您可以使用starg.0 设置“this”而没有任何副作用吗?
为什么这是有问题的:方法是否是实例方法是通过 MethodBuilder 设置的,这有点像一个黑盒子。尽管“this”看起来就像任何其他参数一样,但据我所知,一些 JIT 编译器会单独跟踪“this”并根据该值更改它们的行为。如果在实例方法中设置“this”时有副作用,那么我该如何避免它们呢?