4

使用 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)中的事件?

4

2 回答 2

4

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事件。剩下的就是,正如他们所说,要理解递归,你必须首先理解递归。

希望我说清楚了。

于 2009-02-19T02:43:42.273 回答
3

OnLoad 不调用自身,它调用 Load 事件。Page.OnLoad 方法仅包装对附加事件的调用。不应从 Load 事件处理程序调用 base.OnLoad,否则将导致无限循环。

于 2009-02-19T01:46:38.403 回答