2013-02-27 1 views
6

Grundsätzlich was der Titel sagt. Was ist der Unterschied zwischen diesen beiden (ich zur Zeit mit dem ersten)Unterschied zwischen privaten EventHandler und private EventHandler?

private EventHandler _progressEvent; 

und

private event EventHandler _progressEvent; 

Ich habe eine Methode

void Download(string url, EventHandler progressEvent) { 
    doDownload(url) 
    this._progressEvent = progressEvent; 
} 

Die doDownload Methode nennen würde die

_progressEvent(this, new EventArgs()); 

Es funktioniert soweit gut. Aber ich fühle, dass ich etwas schrecklich falsch mache.

Antwort

8

Der erste definiert einen Delegaten, der zweite definiert ein Ereignis. Die beiden sind verwandt, aber sie werden typischerweise sehr unterschiedlich verwendet. Wenn Sie EventHandler oder EventHandler<T> verwenden, würde dies im Allgemeinen bedeuten, dass Sie ein Ereignis verwenden. Der Aufrufer (für die Verarbeitung des Fortschritts) würde normalerweise für das Ereignis abonnieren (nicht in einem Delegaten übergeben), und Sie würden das Ereignis auslösen, wenn Sie Abonnenten haben.

Wenn Sie einen funktionelleren Ansatz verwenden und einen Delegaten übergeben möchten, würde ich einen geeigneteren Delegaten für die Verwendung auswählen. In diesem Fall liefern Sie keine Informationen wirklich in der EventArgs, also wäre vielleicht nur System.Action geeigneter.

Dies gesagt, ein Ereignis Ansatz erscheint hier angemessener, aus dem kleinen Code gezeigt. Einzelheiten zur Verwendung von Ereignissen finden Sie im C# -Programmierhandbuch unter Events.

Ihr Code, Ereignisse verwenden, wäre so etwas wie wahrscheinlich aussehen:

// This might make more sense as a delegate with progress information - ie: percent done? 
public event EventHandler ProgressChanged; 

public void Download(string url) 
{ 
    // ... No delegate here... 

Wenn Sie Ihren Fortschritt nennen, würden Sie schreiben:

var handler = this.ProgressChanged; 
if (handler != null) 
    handler(this, EventArgs.Empty); 

Der Nutzer der dies als schreiben würde:

yourClass.ProgressChanged += myHandler; 
yourClass.Download(url); 
+0

haben ich glaube, ich weiß nicht wirklich reale Ereignisse brauchen, weil ich nur 1 Teilnehmer habe und ich brauche um die Delegierten zu übergeben. Danke für die Antwort. –

1

Ich glaube nicht, dass es einen Unterschied zwischen den beiden gibt.

Das Ereignisschlüsselwort ist ein Zugriffsmodifizierer wie private intern und geschützt. Es wird verwendet, um den Zugriff auf Multicast-Delegaten zu beschränken.

von sichtbarste Going to wenigsten sichtbar wir

public EventHandler _progressEvent; 
//can be assigned to from outside the class (using = and multicast using +=) 
//can be invoked from outside the class 

public event EventHandler _progressEvent; 
//can be bound to from outside the class (using +=) 
//can be invoked from inside the class 

private EventHandler _progressEvent; 
//can be bound from inside the class (using = or +=) 
//can be invoked inside the class 

private event EventHandler _progressEvent; 
//Same as private. given event restricts the use of the delegate from outside 
// the class - i don't see how private is different to private event