AutoEventWireup和base.OnLoad(e)调用Self导致堆栈溢出
使用VS2008,C#。 当AutoEventWireup
设置为true并且在webform中我调用base.OnLoad(e)
:
protected void Page_Load(object sender, EventArgs e) { base.OnLoad(e); }
base.OnLoad(e)
最终调用Page_Load
(调用自身)。 这最终导致堆栈溢出错误。 我已经能够通过将AutoEventWireup
设置为false并覆盖OnLoad
来解决它:
protected override void OnLoad(EventArgs e) { base.OnLoad(e); }
这按预期工作(没有堆栈溢出)。 但是有人可以解释为什么在第一个例子中base.OnLoad(e)
调用相同的load事件(调用自身)而不是调用基类中的OnLoad
事件( System.Web.UI.Page
)?
OnLoad不会调用自身,它会调用Load事件。 Page.OnLoad方法仅包含对附加事件的调用。 您不应该从Load事件处理程序调用base.OnLoad,否则将导致无限循环。
Page.OnLoad
有以下伪代码
protected virtual void OnLoad() { // some stuff if (Load != null) Load(this, new EventArgs()); }
如果你覆盖OnLoad
函数,会发生什么:你的OnLoad
发生,然后它调用base.OnLoad()
,并调用(空) Load
事件。
如果您实现Load
事件并调用base.OnLoad()
,则会发生以下情况: base.OnLoad()
调用Load
事件。 然后Load
事件调用base.OnLoad()
。 然后, base.OnLoad()
调用Load
事件。 正如他们所说,其余的是理解递归,你必须首先理解递归。
希望我清楚自己。