English 中文(简体)
AutoEventWireup和base.OnLoad(e)调用自身会导致堆栈溢出。
原标题:
  • 时间:2009-02-19 01:31:58
  •  标签:

使用VS2008,C#。当AutoEventWireup设置为true并且在Web表单中调用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)?

最佳回答

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事件。就像人们所说的,要理解递归,您首先必须了解递归。

希望我表达清楚了。





相关问题
热门标签