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

使用VS2008,C#。 当AutoEventWireup设置为true并且在webform中我调用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)调用相同的load事件(调用自身)而不是调用基类中的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事件。 正如他们所说,其余的是理解递归,你必须首先理解递归。

希望我清楚自己。