2013-02-27 11 views
6

Zasadniczo, co mówi tytuł. Jaka jest różnica między tymi dwoma (Obecnie używam pierwszy z nich)Różnica między prywatnym EventHandler a prywatnym EventHandler zdarzenia?

private EventHandler _progressEvent; 

i

private event EventHandler _progressEvent; 

Mam metodę

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

Sposób doDownload nazwałbym

_progressEvent(this, new EventArgs()); 

To działa dobrze, jak dotąd. Ale czuję, że robię coś okropnie nie tak.

Odpowiedz

8

Pierwsza definiuje delegata, druga definiuje zdarzenie. Te dwa są ze sobą powiązane, ale zazwyczaj są używane bardzo odmiennie.

Ogólnie, jeśli używasz EventHandler lub EventHandler<T>, sugeruje to, że używasz wydarzenia. Osoba dzwoniąca (do obsługi postępów) zwykle subskrybuje subskrybując na wydarzenie (nie przekazuje delegata), a Ty podniosłeś wydarzenie, jeśli masz subskrybentów.

Jeśli chcesz zastosować bardziej funkcjonalne podejście i przekazać delegata, wybrałbym bardziej odpowiedniego pełnomocnika do użycia W tym przypadku tak naprawdę nie podajesz żadnych informacji w EventArgs, więc może lepiej byłoby użyć tylko numeru System.Action.

Zgodnie z powyższym podejście do zdarzenia wydaje się bardziej odpowiednie w tym miejscu, od przedstawionego kodu. Aby uzyskać szczegółowe informacje na temat korzystania z wydarzeń, zobacz Events w Przewodniku programowania C#.

Twój kod, za pomocą zdarzenia, prawdopodobnie wyglądać następująco:

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

Po wywołaniu swoje postępy, można napisać:

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

Użytkownik byłoby napisać to jako:

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

Chyba naprawdę nie potrzebują prawdziwych wydarzeń, bo mam tylko 1 abonenta i muszę przekazać delegatom dookoła. Dzięki za odpowiedzi. –

1

Nie sądzę, że istnieje różnica między tymi dwoma.

Słowo kluczowe zdarzenia jest modyfikatorem dostępu, takim jak prywatny wewnętrzny i chroniony. Służy do ograniczania dostępu do delegatów multiemisji.

Idąc od najbardziej do najmniej widoczny widoczny mamy

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 
Powiązane problemy