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

发布于 2024-07-14 01:04:58 字数 607 浏览 4 评论 0原文

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

Using VS2008, C#. When AutoEventWireup is set to true and in a webform I call base.OnLoad(e) like:

protected void Page_Load(object sender, EventArgs e)
{
    base.OnLoad(e);
}

The base.OnLoad(e) ends up calling Page_Load (calls itself). This ends up with a stack overflow error. I've been able to solve it by setting AutoEventWireup to false and overriding OnLoad:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
}

This works as I expected (no stack overflows). But can anyone explain why in the first example base.OnLoad(e) calls the same load event (calls itself) rather than calling the OnLoad event in the base class (System.Web.UI.Page)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦屿孤独相伴 2024-07-21 01:04:58

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 事件调用 base.OnLoad()。 然后,base.OnLoad() 调用 Load 事件。 剩下的就是,正如他们所说,要理解递归,你必须首先理解递归。

希望我说清楚了。

Page.OnLoad has the following pseudo-code inside it

protected virtual void OnLoad() {
    // some stuff

    if (Load != null)
        Load(this, new EventArgs());
}

if you override the OnLoad function, what happens is: Your OnLoad happens, then it calls base.OnLoad(), and that calls the (empty) Load event.

If you implement the Load event and call base.OnLoad(), this is what happens: base.OnLoad() calls the Load event. The Load event then calls base.OnLoad(). Then, base.OnLoad() calls the Load event. And the rest is, as they say, to understand recursion you must first understand recursion.

Hope I made myself clear.

蘑菇王子 2024-07-21 01:04:58

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

OnLoad doesn't call itself, it calls the Load event. The Page.OnLoad method merely wraps the call to the attached events. You should not call base.OnLoad from a Load event handler or it will result in an infinite loop.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文