2013-02-27 17 views
6

Fondamentalmente quello che dice il titolo. cosa è la differenza tra questi due (Attualmente sto usando il primo)Differenza tra EventHandler privato ed evento privato EventHandler?

private EventHandler _progressEvent; 

e

private event EventHandler _progressEvent; 

Ho un metodo

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

Il metodo doDownload avrebbe chiamato il

_progressEvent(this, new EventArgs()); 

Funziona bene, finora. Ma sento che sto facendo qualcosa di terribilmente sbagliato.

risposta

8

Il primo definisce un delegato, il secondo definisce un evento. I due sono correlati, ma sono tipicamente usati in modo molto diverso.

In generale, se si utilizza EventHandler o EventHandler<T>, ciò suggerisce che si sta utilizzando un evento. Il chiamante (per la gestione dell'avanzamento) tipicamente abbona all'evento (non passa in un delegato) e si aumenterà l'evento se si dispone di sottoscrittori.

Se si desidera utilizzare un approccio più funzionale e passare un delegato, sceglierei un delegato più appropriato da utilizzare. In questo caso, non stai fornendo alcuna informazione nello EventArgs, quindi forse l'utilizzo di System.Action sarebbe più appropriato.

Detto questo, un approccio di evento sembra più appropriato qui, dal piccolo codice mostrato. Per i dettagli sull'utilizzo degli eventi, vedere Events nella Guida alla programmazione C#.

Il codice, utilizzando gli eventi, sarebbe probabilmente simile a:

// 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... 

Quando si chiama il vostro progresso, devi scrivere:

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

L'utente di questo sarebbe scrivere questo come:

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

Credo che non si ha realmente bisogno di eventi reali, perché avrò solo 1 abbonato e ho bisogno di passare i delegati intorno. Grazie per la risposta. –

1

Non penso che ci sia una differenza tra i due.

La parola chiave evento è un modificatore di accesso come privato interno e protetto. Viene utilizzato per limitare l'accesso ai delegati multicast.

Passando da più visibile a meno visibile abbiamo

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