调用时的方法实际上递归地调用自身
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()
因此将是一个以堆栈溢出结束的无限递归。
我一直在通过 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()
因此将是一个以堆栈溢出结束的无限递归。