2013-03-13 7 views
9

Jestem trochę nowy w stosunku do c#, więc pomiń tę opcję, jeśli uznasz to za trywialne. Widziałem następujący "dziwny" kod.Prawidłowe użycie akcji i zdarzeń

Czy ktoś może rzucić trochę światła na to.

public event Action _action; 

if (_action != null)    
{ 
    foreach (Action c in _action.GetInvocationList()) 
    { 
     _action -= c; 
    } 
} 

Specjalnie część _action -= c;.

+0

Spójrz na to pytanie: http://stackoverflow.com/questions/447821/how-do-i-unsubscribe-all-handlers- from-an-event-for-a -specjalna-klasa-in-c –

+0

Sprawdź http://stackoverflow.com/questions/1431359/event-action-vs-event-eventhandler, aby uzyskać przegląd Action/ActionHandler – PHeiberg

Odpowiedz

22

Delegat może być delegatem do więcej niż jednej funkcji. Jeśli masz delegata alpha, który deleguje na Alpha() i delegata beta, który deleguje na Beta(), wówczas gamma = alpha + beta; jest delegatem, który dzwoni pod numer Alpha(), a następnie Beta(). gamma - beta tworzy delegata, który dzwoni pod numer Alpha(). To trochę dziwna cecha, być całkowicie szczera.

Opublikowany kod to dziwaczny. Mówi "przejrzyj listę funkcji w akcji, stwórz całą grupę delegatów, które wywołują coraz mniej funkcji, a następnie przypisz delegata, który nic nie robi, aby action. Dlaczego, na Boga, ktokolwiek to zrobił? Wystarczy przypisać null do action i skończyć z tym

2

Usuwa procedury obsługi.

+3

, który jest nieprzydatną odpowiedzią. –

+5

@SamIam: Czy to To jest dokładnie to, o co prosił OP: –

+2

@SamIam - yup - dokładnie to, co robi –

6
public event Action _action; //an event 


if (_action != null) // are there any subscribers? 

{ 
     foreach (Action c in _action.GetInvocationList()) //get each subscriber 
     { 
      _action -= c; //remove its subscription to the event 
     } 
} 
+0

Dzięki za odpowiedź. 'publiczne wydarzenie Action _action;' czy to jest w porządku? Znaczenie nie powinno Akcja przyjmuje parametry od 1 do 16. Powinno to być jak "publiczne zdarzenie Działanie <..> _action;' – saam

+0

Jeśli potrzebujesz jakiegoś argumentu do akcji, tak. Ale są dwie wersje klasy Action w BCL. Nietypowy, który widzisz tutaj (działanie) i ogólny (działanie <>). Poleciłbym jednak pójść ze standardową konwencją zdarzeń użycia zdarzenia EventHandler <>. Zobacz mój komentarz na twoje pytanie. – PHeiberg

+0

Wielkie dzięki za odpowiedź! – saam

2

Wydarzenie jest w rzeczywistości MultiCastDelegate. Kiedy "załączysz" program obsługi zdarzeń, dodaje on odniesienie do jego numeru InvocationList.

Powyższy kod powoduje odłączenie każdego zdarzenia obsługi od InvocationList od zdarzenia - zasadniczo "wyczyszczenie" zdarzenia, co można również wykonać, mówiąc: _action = null.

Powiązane problemy