调用虚拟调用自身的方法

时间:2015-11-29 20:42:55

标签: c# clr

我通过C#阅读了CLR,并阅读了以下内容:

有时,编译器将使用调用指令来调用虚方法,而不是使用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被称为虚拟会递归执行。如果可能的话,有人可以以更简单的方式提供另一种解释或劝告。

谢谢!

1 个答案:

答案 0 :(得分:5)

使用base.ToString()您实际上想要调用ToString()方法的基类实现。

如果您只是调用this.ToString()方法,则会调用"虚拟",即将调用实际类的ToString()

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