4 Stimmen

AutoEventWireup und base.OnLoad(e) Calling Self führen zu Stack Overflow

Mit VS2008, C#. Wenn AutoEventWireup ist auf true gesetzt und in einem Webformular rufe ich base.OnLoad(e) mögen:

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

El base.OnLoad(e) endet mit einem Anruf Page_Load (ruft sich selbst an). Dies führt zu einem Stapelüberlauffehler. Ich konnte das Problem lösen, indem ich AutoEventWireup auf false und Überschreiben OnLoad :

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

Dies funktioniert wie erwartet (keine Stapelüberläufe). Aber kann jemand erklären, warum im ersten Beispiel base.OnLoad(e) ruft dasselbe Ladeereignis auf (ruft sich selbst auf), anstatt die OnLoad Ereignis in der Basisklasse ( System.Web.UI.Page )?

4voto

configurator Punkte 39516

Page.OnLoad enthält den folgenden Pseudocode

protected virtual void OnLoad() {
    // some stuff

    if (Load != null)
        Load(this, new EventArgs());
}

wenn Sie die OnLoad Funktion, passiert folgendes: Ihre OnLoad geschieht, dann ruft es base.OnLoad() und das ruft die (leere) Load Veranstaltung.

Wenn Sie die Load Ereignis und rufen base.OnLoad() passiert Folgendes: base.OnLoad() ruft die Load Veranstaltung. Die Load Ereignis ruft dann base.OnLoad() . Dann, base.OnLoad() ruft die Load Veranstaltung. Der Rest ist, wie man so schön sagt: Um die Rekursion zu verstehen, muss man zuerst die Rekursion verstehen.

Ich hoffe, ich habe mich klar ausgedrückt.

3voto

BC. Punkte 23018

OnLoad ruft nicht sich selbst auf, sondern das Load-Ereignis. Die Methode Page.OnLoad umhüllt lediglich den Aufruf der angehängten Ereignisse. Sie sollten base.OnLoad nicht von einem Load-Event-Handler aus aufrufen, da dies zu einer Endlosschleife führen würde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X