2012-11-29 8 views
6

możemy podnieść zdarzenie na dwa sposoby:NET podnoszenie zdarzenie i NullObject wzór

public event EventHandler MyEvent; 

private void DoSomething() 
{ 
    ... 
    var handler = MyEvent; 
    if (handler != null) 
     handler(this,EventArgs.Empty); 
} 

i

public event EventHandler MyEvent = (o,e) => {} ; 

private void DoSomething() 
{ 
    ... 
    MyEvent(this, EventArgs.Empty); 
} 

Wolę ostatni. Jest krótszy.
Moi koledzy nalegają na pierwszy wariant.

Czy istnieje przewaga pierwszego nad drugą?

+0

Można przynajmniej uprościć pierwszy 'if (this.MyEvent! = Null) this.MyEvent (ten, EventArgs.Empty);' –

+5

@JonB: Wrong; to nie jest bezpieczne dla wątków. – SLaks

+3

Jak zapobiegać ustawianiu zdarzenia na wartość null? –

Odpowiedz

11

Aktualizacja dla C# 6

W języku C# 6 wystarczy użyć operatora null warunkowy tak:

PropertyChanged?.Invoke(this, args); 

To recommended by the Roslyn wiki

Original Odpowiedź

Eric Lippert ma a great blog post on Events and Races, którą powinieneś przeczytać, jeśli nie masz.

Pierwsza opcja może być uważana za bezpieczniejszą niż druga, ponieważ zdarzenie może zostać ustawione na wartość null. Ktoś mógłby bezmyślnie modyfikować klasę. Ponadto, jeśli deserializuje się instancje, druga metoda nie będzie działać (w zależności od używanego mechanizmu szeregowania).

czasami użyć metody pomocnika podnieść zdarzenia

static class Raiser 
{ 
    public static void Raise<T>(this EventHandler<T> evnt, object sender, T args) 
     where T : EventArgs 
    { 
     if (evnt != null) 
     { 
      evnt(sender, args); 
     } 
    } 
} 

class SomeClass 
{ 
    public event EventHandler<EventArgs> MyEvent; 

    private void DoSomething() 
    { 
     MyEvent.Raise(this, EventArgs.Empty); 
    } 
} 
+0

Najlepsze z obu światów i dobre wykorzystanie metod ekstensji, dostaje moją pomarańczową strzałkę. – Paolo

+0

Przyjemna metoda pomocnika. Dzięki! –

+0

Zgadzam się z twoją argumentacją, ale interesuje mnie "niedbała modyfikacja". Czy to znaczy, że powinienem sprawdzić dowolną zmienną w metodzie, która może przypadkowo zostać zmieniona gdzieś indziej w kodzie? Myślałem, że to niezmienniki Code Contracts do tego celu. –

Powiązane problemy