Delegate vs. Event

16/04/2008 - 19:26 von M.Erlinger | Report spam
Hallo
kann mir bitte jemand hier weiterhelfen - die Unterscheidung zwischen einem
Delegate und dem Event:
-) Wenn ich mir einen Delegate definiere, und daran 2 oder mehrer Methoden
anhànge, werden z.B. mit "MyDelete.Invoke();" alle Methoden ausgeführt.
-) gleiches Ergebnis, wenn das in meiner Klasse mit einem Event
"public event SignalHandler Notify;"
durchführe und dann eine Methode definiere wo zum Beispiel das notify-Event
ausgeführt wird:
public void DoSignal()
{
if (this.Notify != null)
Notify("Ein Event ausgelöst.");
/* Notify Delegate definert */
}

Worin genau liegt jetzt der Unterschied, ob Methoden über einen Delegate
oder über Events (die ja schlußendlich auch über einen Delegate arbeiten)
ausgeführt werden ???
Vor- / Nachteil ?

Vielleicht kann mir hier jemand ein paar praktische Tipps geben
Danke schon mal
Michael
 

Lesen sie die antworten

#1 Gilles Kohl [MVP]
16/04/2008 - 22:24 | Warnen spam
On Wed, 16 Apr 2008 19:26:58 +0200, "M.Erlinger"
wrote:

Hallo
kann mir bitte jemand hier weiterhelfen - die Unterscheidung zwischen einem
Delegate und dem Event:
-) Wenn ich mir einen Delegate definiere, und daran 2 oder mehrer Methoden
anhànge, werden z.B. mit "MyDelete.Invoke();" alle Methoden ausgeführt.
-) gleiches Ergebnis, wenn das in meiner Klasse mit einem Event
"public event SignalHandler Notify;"
durchführe und dann eine Methode definiere wo zum Beispiel das notify-Event
ausgeführt wird:
public void DoSignal()
{
if (this.Notify != null)
Notify("Ein Event ausgelöst.");
/* Notify Delegate definert */
}

Worin genau liegt jetzt der Unterschied, ob Methoden über einen Delegate
oder über Events (die ja schlußendlich auch über einen Delegate arbeiten)
ausgeführt werden ???
Vor- / Nachteil ?

Vielleicht kann mir hier jemand ein paar praktische Tipps geben



(In eigener Sache: grade gesehen dass mein letztes Post zum Thema
delegates und Events seit letzter Woche in meiner Outbox schlummerte
... sorry.)

"event" ist im wesentlichen eine Hülle für einen Delegate, die
verhindert dass von aussen a) das Delegate direkt gesetzt wird und b)
das Delegate aufgerufen wird.

Dient der Entkopplung - damit können die Interessenten am Event sich
zwar abonnieren (+= handler) oder das Abo kündigen (-= handler), aber
nicht getürkte Events auslösen, oder die Liste kaputtschreiben.
(Motivation siehe besagtes Posting)

Das ist eigentlich der Unterschied - es gibt das "EventArgs" Muster
(Signatur der EventHandler delegates immer nach dem Prinzip void
Returnwert, "wer meldet" (object sender) und "was ist passiert"
(EventArgs args), aber das ist eine reine Konvention. (Desweiteren
sollte man entsprechend dem Muster noch eine virtuelle "OnXXX" Methode
spendieren um abgeleiteten Klassen die Chance zu geben das Event
auszulösen resp. eigene Logik einzubringen.)

Intern erzeugt der Compiler eine Klasse mit einem privaten
Delegate-Feld, und automatisch generierten Accessoren "add" und
"remove", die man übrigens auch selber schreiben kann.

Viele Grüße,
Gilles.

Regards,
Gilles [MVP].

(Please reply to the group, not via email.
Find my MVP profile with past articles / downloads here:
http://www.gilleskohl.de/mvpprofile.htm)

Ähnliche fragen