AutoEventWireup и base.OnLoad (e) Вызов Self, приводящий к переполнению стека - PullRequest
4 голосов
/ 19 февраля 2009

Использование 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)?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2009

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. А остальное, как говорится, чтобы понять рекурсию, сначала нужно понять рекурсию.

Надеюсь, я все прояснил.

3 голосов
/ 19 февраля 2009

OnLoad не вызывает себя, он вызывает событие Load. Метод Page.OnLoad просто переносит вызов к прикрепленным событиям. Вы не должны вызывать base.OnLoad из обработчика события Load, иначе это приведет к бесконечному циклу.

...