2010-06-30 2 views
6

Spesso usiamo gestore di eventi in C#, così come di seguito:Quando si verifica la registrazione del gestore eventi?

some_event+=some_event_handler; 

questo accade in fase di compilazione o l'esecuzione? Cosa succede se some_event è membro statico? AFAIK, il qual_event non contiene nient'altro che l'indirizzo di ingresso di some_event_handler e l'indirizzo del metodo di some_event_handler potrebbe essere determinato al momento della compilazione. Se some_event è un membro statico, il valore di some_event potrebbe essere determinato al momento della compilazione? Ho capito che se some_event è un membro di un'istanza, il suo valore sarà impostato al momento della creazione dell'istanza dell'oggetto. Correggimi se sbaglio.

Molte grazie, ragazzi ~ :)

+0

Una piccola nota: "some_event" contiene un * elenco * di indirizzi di ingresso, è possibile che più gestori si iscrivano allo stesso evento. –

+0

Grazie Hans, per il ricordo. – smwikipedia

risposta

0

La sottoscrizione avviene in fase di esecuzione. Può essere condizionale.

+0

Grazie Pavel. Ho solo bisogno della prova. ;) – smwikipedia

+0

Una prova, come prova matematica?:) Bene, se accadesse in fase di compilazione, non saresti in grado di sottoscriverti condizionatamente quando il fatto che la sottoscrizione sia richiesta non è noto al momento della compilazione. Ad ogni modo, guarda MSIL. –

+0

Bello e logico. Grazie. – smwikipedia

1

Possiamo dire che riguarda delegates. A una variabile delegate viene assegnato un metodo in modo dinamico. Questo ci dà la possibilità di scrivere metodi di plugin.

Per esempio e obiettivi metodo statico solo una nota da C# nella sintesi

Quando un oggetto delegato è assegnato a un metodo di istanza, l'oggetto delegato deve mantenere un riferimento non solo al metodo, ma anche all'istanza a cui appartiene il metodo . La proprietà Target della classe System.Delegate rappresenta questa istanza (e sarà nullo per un delegato che fa riferimento a un metodo statico).

+0

Grazie in incognito, le informazioni fornite sono molto istruttive. – smwikipedia

0

Il codice è solo un'istruzione, simile a una chiamata di metodo, e quindi si verifica nel flusso di esecuzione naturale nel punto in cui è stato inserito, sia all'interno di un ciclo, se-istruzione o simili.

Come tale, prima che l'istruzione sia stata eseguita, all'evento non è stato assegnato il gestore di eventi. Non importa (in questo contesto) se l'evento è un evento statico o di istanza.

si può considerare come il codice di comportamento e confrontarlo con questo codice:

some_event = Delegate.Combine(some_event, some_event_handler); 

allora dovrebbe essere chiaro che questa è solo una chiamata di metodo di base, niente di più.

La sintassi di event += handler è solo una scorciatoia per il codice sopra riportato e il compilatore tradurrà la sintassi in tale chiamata di metodo. Se usi Reflector puoi vedere che questo è come è fatto.

Vedere Delegate.Combine su MSDN.

+0

Grazie Lasse, mi cancelli un po 'di nebbia. ;) – smwikipedia