2009-04-11 5 views
3

Würden Sie tun:Eine generische Ereignisnamen oder mehrere beschreibende Ereignisnamen

this.btSomeButton.Click += btSomeButton_OnClick; 

private void btSomeButton_OnClick(object sender, EventArgs e) 
{ 
    this.DoFunc1(); 
    this.DoFunc2(); 
} 

Oder:

this.btSomeButton.Click += DoFunc1; 
this.btSomeButton.Click += DoDunc2; 

Gibt es versteckte Implikationen für die zweite Methode? Wie ist es garantiert, dass DoFunc2() nach DoFunc1() ausgeführt wird?

Antwort

2

Ich denke, die erste Methode ist sicherer.

AFAIK gibt es keine Garantie, wenn es zur Methodenausführungsreihenfolge kommt, und wenn die Methoden in einer sequenziellen kommen, macht die erste Methode sowieso mehr Sinn.

Wenn mehrere Ereignisbehandlungsroutinen an ein Ereignis angehängt sind, können andere Ereignisse beim Trennen einzelner Ereignisbehandlungsroutinen sehr leicht übersehen werden.

+2

Obwohl die Ausführungsreihenfolge garantiert ist (siehe http://msdn.microsoft.com/en-us/library/system.multicastdelegate.aspx), ist es immer noch übersichtlicher, die erste Methode zu verwenden. –

0

ich das erste tun würde auch ..

Perfomance sollte in den zwei Beispielen auf die gleiche sehr nahe, aber # 1 ist einfacher imho zu lesen - aber es hängt davon sorta auf, was sie tun . Ich würde dies zum Beispiel bevorzugen:

this.btSomeButton.Click += DoSomethingRelatedToDataPersistence; 
this.btSomeButton.Click += DoSomethingRelatedToTheDirectionTheMoonSpinsAroundTheEarth; 

.. Ich hoffe, dass Sie meine Drift fangen: P

Wenn Sie den 2 Event-Handler in 1 gemeinsames Verfahren binden können (sprechen von einer Domain-Perspektive) Ich würde das tun. Wenn die Handler völlig un-verwandt sind, würde ich sie in verschiedenen Handlern behalten.

Die Antwort ist sehr subjektiv imho. Niemand wird in der Lage sein, eine "endgültige Antwort, Fall geschlossen" -Kinderantwort zu liefern.

0

Ich würde die erste verwenden, nur aus dem Grund, dass es herkömmliche Praxis ist, so klar zu anderen Entwicklern. Event-Handler-Jonglieren ist schwer genug, um auf jeden Fall aufzuspüren, also geben Sie allen so viel Hilfe wie möglich.

0

Hängt davon ab.

würde ich zweite Option verwenden, wenn alle (oder die meisten) unten erfüllt sind:

  • DoFunc1 und DoFunc2 sind völlig unabhängig von jedem-andere in Bezug auf Funktionalität.
  • Reihenfolge der Anruf ist nicht wichtig (auch im Falle einer Ausnahme usw.).
  • DoFunc1 und DoFunc2 haben keine Signaturprobleme beim Empfang von Standard-Ereignisparametern.
  • DoFunc1 und DoFunc2 sind keine primitiven Funktionen im Kontext des Designs.
  • Verschiedene Regionen des Quellcodes können entscheiden, wie viele Abonnenten benötigt werden.
  • DoFunc1 und DoFunc2 sind Teil einer anderen Klasse, die entkoppelt werden muss.
  • Ich möchte benutzerdefinierte Verarbeitung tun, wenn DoFunc1 und DoFunc2 abonniert oder abgemeldet sind.

Wenn Reihenfolge wichtig ist, muss die erste Option, wie es klar ist. Ich weiß nicht, ob die C# -Spezifikation die Reihenfolge in der zweiten Option garantiert.

0

Ah, jetzt bekomme ich die Frage.Dies ist eine Frage über Multicast Delegates. Gemäß der Dokumentation ...

Ein MulticastDelegate verfügt über eine verknüpfte Liste von Delegaten, die so genannte Aufrufliste, die aus einem oder mehreren Elementen besteht. Wenn ein Multicast-Delegat aufgerufen wird, werden die Delegaten in der Aufrufliste synchron in der Reihenfolge aufgerufen, in der sie angezeigt werden.

Wenn Sie sich für die Bestellung der Anrufe interessieren, würde ich mich jedoch nicht darauf verlassen, und ich würde die erste Methode oder die Methode unten verwenden.

Sie tun können, wenn sowohl die Syntax mögen, aber die funktionelle Abstraktion beider Anrufe wollen ...

this.btSomeButton.Click += (sender, args) 
{ 
    this.doFunc1(); 
    this.doFunc2(); 
}; 
+0

Ich denke, das ist semantisch gleichbedeutend mit der ersten Option mit btSomeButton_OnClick anonymisiert. – isntn

+0

Ja, aber hat den Anon-Delegaten und Lambda-Syntax. –

0

ziehe ich die erste Option für einen einzelnen (subjektiven) Grund.

Dies ist viel aussagekräftiger und für andere Menschen später leichter zu verstehen. Dies wird wichtig, wenn das Ereignis ein Ereignis ist, bei dem sich die Teilnehmer später abmelden müssen - ein einzelnes Ereignis, das abgemeldet werden muss, wird wahrscheinlicher von anderen Personen in der Zukunft als 2 Ereignisse korrekt behandelt.

Da Sie nach der Reihenfolge der Ausführung gefragt haben, deutet dies darauf hin, dass die 2 Funktionen verwandt sind. Dadurch wird das Abmelden des Ereignisses erzwungen, so dass es nicht möglich wäre, func1() und nicht func2() abzumelden, was sehr wahrscheinlich ist, wenn Sie sich Sorgen um die Reihenfolge der Ausführung machen (was übrigens garantiert ist)).

Verwandte Themen