3

背景:我正在为一个学校项目编写一个 .NET 编译器(非常类似于 C#)。我目前尝试添加的功能之一是方法内的尾调用递归。

更多信息:在 CIL 中,“this”被传递给实例方法,就好像它只是另一个参数一样。因此,访问静态方法的第一个参数,您将发出 ldarg.0,但访问实例方法的第一个参数,您将发出 ldarg.1,而在实例方法中访问“this”,您将发出 ldarg.0 . (实例方法比我想象的更类似于扩展方法。)

问题:您可以使用starg.0 设置“this”而没有任何副作用吗?

为什么这是有问题的:方法是否是实例方法是通过 MethodBuilder 设置的,这有点像一个黑盒子。尽管“this”看起来就像任何其他参数一样,但据我所知,一些 JIT 编译器会单独跟踪“this”并根据该值更改它们的行为。如果在实例方法中设置“this”时有副作用,那么我该如何避免它们呢?

4

2 回答 2

2

您可能想看看F# 如何实现 tail-call

于 2012-02-08T23:51:18.727 回答
1

您可以将其提取为局部变量。这样你就会知道你可以安全地设置它。(我希望我能正确理解你的问题)

于 2012-02-08T23:46:17.263 回答