2016-05-06 10 views
7

Zawsze powoływać wydarzenia jak takWywoływanie wydarzenia, H (args) vs EventName .Invoke()

void onSomeEvent(string someArg) { 
    var h = this.EventName; 
    if (h != null) { 
     h(this, new MyEventArgs(someArg)); 
    } 
} 

Dziś VS 2015 mówi mi, że to może być uproszczone:

MyEvent?.Invoke(this, new MyEventArgs(someArg)); 

A kilka pytań na temat tej ostatniej metody, których nie widziałem wcześniej:

  1. przypuszczalnie ? po nazwie imprezy jest sprawdzenie, czy program obsługi jest zerowy?
  2. Zakładając obsługi nie jest null, .Invoke() wydaje się dość prosta
  3. Użyłem pierwszy przykład od lat i zdać sobie sprawę, że zapobiega warunków wyścigu ... przypuszczalnie ?.Invoke() drugiego przykładu robi tak dobrze?
+0

Dlaczego według ciebie nowa składnia odczytałaby go dwa razy, gdyby pojawiła się tylko raz w źródle? – SLaks

+0

@SLaks - Nie wiem. Być może to mój brak zrozumienia, co tak naprawdę powoduje stan wyścigu, który wydaje ci się (i Jon) implikować, ponieważ jest czytany więcej niż raz? – jleach

+0

Nie wiem, kto napisał kod, aby rozpoznać ten konkretny wzór kodu i zdecydować, że mógłbym użyć nowej funkcji, aby go zaimplementować zamiast ... jednego z wielu powodów, dla których VS jest najbardziej imponującym IDE, jakie kiedykolwiek widziałem. – jleach

Odpowiedz

7

Przypuszczalnie? po nazwie zdarzenia znajduje się sprawdzenie, czy program obsługi ma wartość zerową?

Tak. Jest to operator warunkowy zerowy, wprowadzony w języku C# 6. Jest przydatny na wszystkie sposoby.

Użyłem pierwszy przykład od lat i zdać sobie sprawę, że zapobiega warunków wyścigu ... przypuszczalnie ?.Invoke() drugiego przykładu robi tak dobrze? (zobacz pytanie nr 1):

Tak. Zasadniczo są one równoważne. W szczególności nie wykonuje ono dwukrotnej ekspresji . Oblicza go raz, a następnie, jeśli wynik nie jest pusty, wywołuje on na nim Invoke.

+0

Dzięki Jon ... czy możesz zobaczyć moją edycję i zaoferować wgląd w to tak dla pewności? (edytuj: wydaje się, że istnieją pewne implikacje, że stan wyścigu, któremu zawsze zapobiegałem, spowodowany jest dwukrotnym przeczytaniem MyEvent ... to było dla mnie nieznane) – jleach

+3

@ jdl134679: Tak, stan wyścigu w 'if (MyEvent! = null) {MyEvent.Invoke (...); } 'rzeczywiście jest spowodowane odczytaniem go dwa razy - ponieważ może być bez wartości null po raz pierwszy, a następnie po raz drugi. Więc musisz przeczytać to tylko raz. Możesz to zrobić przechowując wartość w zmiennej lokalnej lub używając operatora warunkowego null. –

+1

Jest to całkiem elegancko wyglądające: https://msdn.microsoft.com/en-us/library/dn986595.aspx (patrz C# 6.0 null-conditional). Oczekuję, że znajdę wiele zastosowań dla tego. Dzięki jeszcze raz! – jleach

Powiązane problemy