2008-08-21 13 views
2

In meinem Code hinter ich meine Ereignisse verdrahten wie so:Aufruf Basismethoden Bei Übergeordnete Seite Level Event

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    btnUpdateUser.Click += btnUpateUserClick; 
} 

Ich habe es so gemacht, weil das ist, was ich in den Beispielen gesehen habe.

  • Muss die base.OnInit() -Methode aufgerufen werden?
  • Wird es implizit aufgerufen werden?
  • Ist es besser, es am Anfang der Methode oder am Ende zu nennen?
  • Was wäre ein Beispiel, wo Verwirrung über die Basismethode Sie in Schwierigkeiten bringen kann?

Antwort

3

ein EventArgs Parameter nehme ich klären sollte:

Die Richtlinien empfehlen, dass ein Ereignis Brennen beinhalten sollte eine virtuelle „On Aufruf EventName "Methode, aber sie sagen auch, dass, wenn eine abgeleitete Klasse diese Methode überschreibt und vergisst, die Basismethode aufzurufen, das Ereignis noch ausgelöst werden sollte.

Siehe „Wichtiger Hinweis“ etwa in der Mitte this page:

Abgeleitete Klassen, die die geschützte virtuelle Methode überschreiben, sind nicht erforderlich, um die Basisklassenimplementierung zu nennen. Die Basisklasse muss weiterhin ordnungsgemäß funktionieren, selbst wenn ihre Implementierung nicht aufgerufen wird.

0

Wenn Sie in diesem Fall die Basis OnInit nicht aufrufen, wird Init sogar nicht ausgelöst.

Im Allgemeinen empfiehlt es sich, IMMER die Basismethode aufzurufen, sofern Sie nicht speziell wissen, dass das Basisverhalten nicht auftreten soll.

Ob es am Anfang oder am Ende aufgerufen wird hängt davon ab, wie Sie wollen, dass die Dinge funktionieren. In einem Fall wie diesem, in dem Sie einen Override anstelle eines Ereignishandlers verwenden, ist es sinnvoller, sie am Anfang der Methode aufzurufen. Auf diese Weise wird Ihr Code nach allen Handlern ausgeführt, wodurch er einen "normalen" Event-Handler emuliert.

0

Obwohl die offiziellen Rahmen-Design-Richtlinien sonst empfehlen, die meisten Klasse-Designer tatsächlich die OnXxx() -Methode verantwortlich machen für das eigentliche Ereignis feuern, wie folgt aus:

protected virtual void OnClick(EventArgs e) 
{ 
    if (Click != null) Click(this, e); 
} 

... also, wenn Sie von der erben Klasse und nicht base.OnClick (e), das Click-Ereignis wird nie ausgelöst.

Also ja, auch wenn dies sollte nicht der Fall sein nach den offiziellen Design-Richtlinien, ich denke, es lohnt sich, base.OnInit (e) aufrufen, um sicher zu sein.

0

offiziellen Rahmen-Design-Richtlinien empfehlen sonst

Sie tun? Ich bin neugierig, ich habe immer das Gegenteil geglaubt, und das Lesen von Framework Design Guidelines und das Ausführen von FxCop hat nur meine Meinung zementiert. Ich hatte den Eindruck, dass die Ereignisse sollten immer von virtuellen OnXxx() Methoden gebrannt werden, die

0

Sie sind wahrscheinlich besser dran, es so zu machen, dann geht diese Debatte weg. Der Artikel ist jedoch interessant, insbesondere wenn man bedenkt, dass das .NET Framework diese Richtlinie nicht berücksichtigt.

0

@ Ch00k und @Scott Ich weiß nicht - Ich mag die On EventName Muster selbst. Und ja, ich bin einer der Leute, die schuldig sind, das Ereignis von dieser Methode zu feuern.

Ich denke, das Überschreiben der On * -Methode und das Aufrufen der Basis ist der Weg zu gehen. Deine eigenen Ereignisse zu behandeln scheint irgendwie falsch zu sein.