2009-04-27 16 views
2

Ich werfe nur als eine Frage der Neugier da diese aus ...Ereignisse oder Lambdas in C#?

Angenommen, Sie sind nur erwartet/will eine Methode, wäre dies verpönt oder schlechte Praxis zur Verfügung gestellt werden?

public class Something { 
    public Action OnRemove =() => { }; 
    public Action<object, EventArgs> OnFinishedLoading = (sender, e) => { }; 
} 

// then used like... 
something.OnRemove =() => { /*do something...*/ }; 
something.OnFinishedLoading = (sender, e) => { /*do something else...*/ }; 

Ich weiß, das wie Betrug bei Veranstaltungen, aber ich alles andere gibt, die diesen Ansatz schlecht ist? Würde dies langfristig zu potenziellen Problemen mit Ihrer Bewerbung führen?

Ich weiß, wenn Sie wollen mehr als eine Methode zu laufen, dann wäre ein Ereignis besser, das ist hauptsächlich eine Frage von, wenn Sie nur eine Methode wollen/erwarten.

+0

Was sehen Sie als Vorteile der Verwendung dieses Ansatzes gegenüber der Verwendung von Ereignissen? – MichaC

+0

Nichts, was mir bekannt ist - Hauptsächlich neugierig, ob dies eine unverhoffte Möglichkeit ist, dies zu tun. – Hugoware

Antwort

0

Mit der Veranstaltung, können Sie dies nicht tun:

something.OnRemove = null; 

Die Ereignisse geben Ihnen einen Wrapper, die Art der Verpackung mit Eigenschaften und Attributen, so dass Sie Verkapselung über die Delegatmethode gewährleisten können.

+0

Außer wenn ich mich richtig erinnere, ist ein Ereignis null, bis ein Handler zugewiesen wird, was zu der gleichen Situation führen kann. – Hugoware

6

Nun, die offensichtlichste Sache "falsch" mit ihm ist, dass es öffentlichen Bereichen ausgesetzt ist. Ich würde zumindest eine Eigenschaft verwenden - zu diesem Zeitpunkt wäre ein Event sowieso einfacher. Es bietet mehr Flexibilität mit weniger Code als eine Eigenschaft (weil Sie eine automatisch implementierte Eigenschaft mit einem bestimmten Standardwert nicht verwenden konnten).

Die andere Alternative wäre, es im Konstruktor zu nehmen und es dann als ein privates schreibgeschütztes Feld zu behalten. Das wäre wahrscheinlich das, was ich wirklich tun würde ... ist es wirklich notwendig, die Aktion als eine Eigenschaft/ein Feld überhaupt aufzudecken?

+0

Ich habe Felder verwendet, um die Länge des Codes im obigen Beispiel einfach zu verkürzen. – Hugoware

+0

Wenn Sie eine Frage über gute/schlechte Praxis stellen, ist es wahrscheinlich am besten, nicht wissentlich eine schlechte Praxis zu injizieren, um der Kürze willen;) –

1

Es ist nichts falsch an diesem Ansatz und ich benutze es sehr oft. Es macht einfache Handler einfachen Code (was eine gute Sache ist).

Der einzige Nachteil dieses Ansatzes ist, dass ein auf diese Weise erstellter Handler nicht einfach entfernt werden kann. Normalerweise sagen Sie

Aber das ist nicht bei allen Lambda-Ausdrücken der Fall. Textuell gleiche Lambda-Ausdrücke werden fast sicher getrennte Implementierungen haben und daher nicht zum Hinzufügen und Entfernen von Event-Handlern passen.

Zum Beispiel kann der folgende Code den Handler nicht entfernen.

something.OnRemove +=() { MessageBox.Show("Removed!"); } 
something.OnRemove -=() { MessageBox.Show("Removed!"); } 

Aber solange Sie nur hinzufügen möchten, ist dies kein Problem.

1

Es ist potenziell mehr als Sie wollen. Normalerweise erlaubt ein Ereignis einem Client nicht, den Inhalt des MulticastDelegate zu überprüfen, der das Ereignis unterstützt.

1

Ich denke, dieser Ansatz ist in Ordnung, es ist nur eine Kurzform, um einen Delegierten zu deklarieren (siehe die Definition der Action-Familie).