使用VS2008,C#。当AutoEventWireup
设置为true且在网络表单中,我将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)
调用相同的加载事件(调用自身)而不是调用基类中的OnLoad
事件(System.Web.UI.Page
)?
答案 0 :(得分:4)
Page.OnLoad
里面有以下伪代码
protected virtual void OnLoad() {
// some stuff
if (Load != null)
Load(this, new EventArgs());
}
如果您覆盖OnLoad
函数,会发生以下情况:您的OnLoad
发生了,然后调用base.OnLoad()
,然后调用(空)Load
事件。< / p>
如果您实施Load
事件并致电base.OnLoad()
,则会发生以下情况:base.OnLoad()
调用Load
事件。 Load
事件会调用base.OnLoad()
。然后,base.OnLoad()
调用Load
事件。正如他们所说,其余的是理解递归,你必须首先理解递归。
希望我能说清楚。
答案 1 :(得分:3)
OnLoad不会调用自身,它会调用Load事件。 Page.OnLoad方法仅包含对附加事件的调用。您不应该从Load事件处理程序调用base.OnLoad,否则将导致无限循环。