2013-03-13 13 views
9

Sono un po 'nuovo a c# quindi per favore trascurare se lo trovi banale. Ho visto il seguente codice "strano".Uso corretto di azioni ed eventi

Qualcuno può gettare un po 'di luce su di esso.

public event Action _action; 

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

In particolare la parte _action -= c;.

+0

Dai un'occhiata a questa domanda SO: http://stackoverflow.com/questions/447821/how-do-i-unsubscribe-all-handlers-from-an-event-for-a -particular-class-in-c –

+0

Controlla http://stackoverflow.com/questions/1431359/event-action-vs-event-eventhandler per una panoramica di Action vs EventHandler – PHeiberg

risposta

22

Un delegato può essere delegato a più di una funzione. Se si dispone di un delegato alpha delegato a Alpha() e un delegato beta delegato a Beta() quindi gamma = alpha + beta; è un delegato che chiama Alpha() quindi Beta(). gamma - beta produce un delegato che chiama Alpha(). È un po 'strano, per essere sinceri.

Il codice che hai postato è bizzarro. Dice "passa alla lista delle funzioni in azione, genera un'intera pila di delegati che invocano sempre meno funzioni e infine assegna un delegato che non fa nulla a action. Perché mai qualcuno dovrebbe farlo? Basta assegnare null a action

2

Sta rimuovendo i gestori per l'azione.

+3

questa è una risposta inutile –

+5

@ Samam: È esso ? È esattamente quello che ha chiesto l'OP. –

+2

@SamIam - sì - esattamente quello che fa. –

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

Grazie per la risposta. 'evento pubblico Action _action;' questo è ok? Il significato non dovrebbe assumere i parametri da 1 a 16. Non dovrebbe essere come "evento pubblico Azione <..> _action;' – saam

+0

Se hai bisogno di un qualche tipo di argomento per l'azione, sì. Ma ci sono due versioni della classe Action nel BCL. Il non generico vedi qui (Azione) e il generico (Azione <>). Consiglio comunque di andare con la convenzione di evento standard dell'utilizzo dell'evento EventHandler <>. Vedi il mio commento sulla tua domanda. – PHeiberg

+0

Grazie mille per la risposta! – saam

2

Un evento è in realtà un MultiCastDelegate. Quando "colleghi" un gestore di eventi, aggiunge un riferimento al numero InvocationList.

Il codice di cui sopra sta scollegando ogni gestore di eventi nel InvocationList dall'evento, essenzialmente "cancellando" l'evento, operazione che potrebbe anche essere eseguita chiamando _action = null.