调用时的方法实际上递归地调用自身

Method when called virtually calling itself recursively

我一直在通过 C# 阅读 CLR,我阅读了以下内容:

有时,编译器会使用call 指令来调用虚方法,而不是使用callvirt 指令。起初,这似乎令人惊讶,但下面的代码演示了为什么有时需要它:

internal class SomeClass {
// ToString is a virtual method defined in the base class: Object.
public override String ToString() {
// Compiler uses the ‘call’ IL instruction to call
// Object’s ToString method nonvirtually.
// If the compiler were to use ‘callvirt’ instead of ‘call’, this
// method would call itself recursively until the stack overflowed.
return base.ToString();
}
}

调用base.ToString(虚方法)时,C#编译器会发出调用指令,确保基类型中的ToString方法被非虚调用。这是必需的,因为如果虚拟调用 ToString,调用将递归执行,直到线程的堆栈溢出,这显然是不希望的。

虽然这里解释了,但我不明白为什么虚拟调用的ToString会递归执行。如果可能的话,有人可以提供另一种解释或以更简单的方式描述它吗?

谢谢!

使用 base.ToString() 你实际上想调用基础 class ToString() 方法的实现。

如果您简单地调用 this.ToString() 方法将被调用 "virtually",即实际 class 的 ToString() 将被调用。

在您的示例中,如果 base.ToString() 被调用 "virtually",它将与 this.ToString() 相同,这将以 ToString() 方法结束,再次调用相同的 ToString()因此将是一个以堆栈溢出结束的无限递归。