2009-02-19 51 views
4

使用VS2008,C#。當AutoEventWireup設置爲true,並在一個WebForm我打電話base.OnLoad(e)這樣的:AutoEventWireup和base.OnLoad(e)調用自身導致堆棧溢出

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

base.OnLoad(e)結束調用Page_Load(自稱)。這最終會導致堆棧溢出錯誤。我已經能夠通過設置AutoEventWireup以虛假的和壓倒一切OnLoad來解決這個問題:

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

這工作如我所料(無堆棧溢出)。但任何人都可以解釋爲什麼在第一個例子中,base.OnLoad(e)調用相同的加載事件(調用自己),而不是調用基類中的OnLoad事件(System.Web.UI.Page)?

回答

3

OnLoad不會調用它自己,它會調用Load事件。 Page.OnLoad方法僅包含對附加事件的調用。您不應該從Load事件處理程序調用base.OnLoad,否則將導致無限循環。

+0

但爲什麼base.OnLoad(e)沒有調用基類的Load事件? – 2009-02-19 01:52:29

+0

它的確如此。這就是處理Load事件和調用base.OnLoad導致無限循環的原因。 – 2009-02-19 01:55:18

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事件。正如他們所說,剩下的就是要理解遞歸,你必須首先理解遞歸。

希望我說清楚了。