AutoEventWireup和base.OnLoad(e)调用Self导致堆栈溢出

时间:2009-02-19 01:31:58

标签: c# asp.net autoeventwireup

使用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)?

2 个答案:

答案 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,否则将导致无限循环。