4

VS2008、C#を使用します。AutoEventWireupがtrueに設定されている場合、Webフォームでは次のように呼び出しますbase.OnLoad(e)

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

最終base.OnLoad(e)的に呼び出しPage_Loadます(自分自身を呼び出します)。これにより、スタックオーバーフローエラーが発生します。AutoEventWireupfalseに設定してオーバーライドすることで解決できましたOnLoad

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

これは期待どおりに機能します(スタックオーバーフローはありません)。しかし、最初の例で、基本クラス()のイベントをbase.OnLoad(e)呼び出すのではなく、同じロードイベントを呼び出す(それ自体を呼び出す)理由を誰かが説明できますか?OnLoadSystem.Web.UI.Page

4

2 に答える 2

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。そして残りは、彼らが言うように、再帰を理解するには、最初に再帰を理解する必要があります。

私が自分自身を明確にしたことを願っています。

于 2009-02-19T02:43:42.273 に答える
3

OnLoad はそれ自体を呼び出さず、Load イベントを呼び出します。Page.OnLoad メソッドは、添付イベントへの呼び出しをラップするだけです。Load イベント ハンドラーから base.OnLoad を呼び出さないでください。呼び出すと、無限ループが発生します。

于 2009-02-19T01:46:38.403 に答える