2010-05-20 9 views
5

Czy ktoś widzi jakieś wady? Należy zauważyć, że nie można usunąć anonimowych metod z listy delegatów wydarzeń, jestem tego świadomy (właściwie to była konceptualna motywacja do tego).C# Events and Lambdas, alternatywa dla sprawdzania zerowego?

Naszym celem jest alternatywą:

if (onFoo != null) onFoo.Invoke(this, null); 

I kod:

public delegate void FooDelegate(object sender, EventArgs e); 

public class EventTest 
{ 
    public EventTest() 
    { 
     onFoo += (p,q) => { }; 
    } 

    public FireFoo() 
    { 
     onFoo.Invoke(this, null); 
    } 

    public event FooDelegate onFoo; 

}

+0

dobrze, poprosił mnie nie pytać, więc nie będę. –

+0

Nie ma żadnych poważnych wad. Nie przychodzą mi do głowy żadne korzyści. – Jay

Odpowiedz

3
public event FooDelegate onFoo = delegate {}; 
+0

Nie jestem pewien, co próbujesz powiedzieć. Być może "delegate (p, q) {};"? Delegat przyjmuje dwa parametry. – Sprague

+0

przy tej inicjalizacji zdarzenia można wywołać zdarzenie bez sprawdzania zerowej wartości. Nie, po prostu deleguj {}. – Nagg

+0

źle głosować tę odpowiedź, jeśli to działa, testowanie go jutro rano. – Sprague

5

Jedną z alternatyw jest, aby metodę rozszerzenia Zamiast:

public static class EventExtensions { 
    public static void Fire<T>(this EventHandler<EventArgs<T>> handler, object sender, T args) { 
     if (handler != null) 
      handler(sender, new EventArgs<T>(args)); 
    } 
} 

Teraz jest to s T:

TimeExpired.Fire(this, new EventArgs()); 
0

Najnowsze wersje Visual Studio automatycznie sugerują używanie null-conditional operator:

onFoo?.Invoke(this, null); 

(gdy ten rodzaj kodu napotkaniu: if (onFoo != null) onFoo.Invoke(this, null)).

Operator ten stał się dostępny w wydaniu C# 6,0 w 2015