AutoEventWireup 和 base.OnLoad(e) 调用 Self 导致堆栈溢出
使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Page.OnLoad
内部有以下伪代码,如果您重写
OnLoad
函数,会发生什么:您的OnLoad
发生,然后它调用base.OnLoad()
,并调用(空)Load
事件。如果您实现
Load
事件并调用base.OnLoad()
,则会发生以下情况:base.OnLoad()
调用加载事件。 然后,
Load
事件调用base.OnLoad()
。 然后,base.OnLoad()
调用Load
事件。 剩下的就是,正如他们所说,要理解递归,你必须首先理解递归。希望我说清楚了。
Page.OnLoad
has the following pseudo-code inside itif you override the
OnLoad
function, what happens is: YourOnLoad
happens, then it callsbase.OnLoad()
, and that calls the (empty)Load
event.If you implement the
Load
event and callbase.OnLoad()
, this is what happens:base.OnLoad()
calls theLoad
event. TheLoad
event then callsbase.OnLoad()
. Then,base.OnLoad()
calls theLoad
event. And the rest is, as they say, to understand recursion you must first understand recursion.Hope I made myself clear.
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.