繁体   English   中英

调用虚拟调用自身的方法

[英]Method when called virtually calling itself recursively

我一直在通过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被称为虚拟会递归执行。 如果可能的话,有人可以提供另一种解释或以更简单的方式描述它。

谢谢!

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

如果你只是调用this.ToString()方法将被“虚拟”调用,即实际类的ToString()将被调用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM