2012-11-25 17 views
7

Per esempio:Come funziona l'operatore + per combinare i delegati?

delegate void SomeDelegate(); 

SomeDelegate a = new SomeDelegate(() => Console.WriteLine("A")); 
SomeDelegate b = new SomeDelegate(() => Console.WriteLine("B")); 

SomeDelegate c = a + b; 

Nell'ultima riga, cosa a + b traducono in? Sono solo curioso di sapere come aggiungerli senza usare l'operatore +.

+0

Non sapevo che questo sia un codice C# valido. – rekire

+0

@rekire: beh, la prima riga dovrebbe essere al di fuori di una funzione e il prossimo 3 sarebbe in una. –

risposta

5

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx - Ricerca per l'aggiunta:

Un delegato può chiamare più di un metodo quando viene richiamato. Questo è indicato come multicasting. Per aggiungere un metodo in più all'elenco di metodi del delegato, l'elenco di chiamate, è sufficiente aggiungere due delegati utilizzando gli operatori di assegnazione addizione o aggiunta ('+' o '+ ='). Ad esempio:

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod; 

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3; 

A questo punto allMethodsDelegate contiene tre metodi nel suo invocazione lista-Method1, Method2 e DelegateMethod. I tre delegati originali , d1, d2 e d3 rimangono invariati. Quando viene invocato allMethodsDelegate, tutti e tre i metodi vengono richiamati in ordine. Se il delegato utilizza i parametri di riferimento, il riferimento viene passato in sequenza a ciascuno dei tre metodi a sua volta e le eventuali modifiche di un metodo sono visibili al metodo successivo. Quando uno qualsiasi dei metodi genera un'eccezione che non viene rilevata nel metodo, l'eccezione viene passata al chiamante del delegato e non vengono chiamati i successivi metodi nell'elenco di chiamata.

Aggiornamento

Entrambi i delegati derivano da System.Delegate È possibile utilizzare i combine() metodi per aggiungere due delegati insieme.

+0

Sì, so che l'aggiunta funziona. Sto chiedendo come funziona l'aggiunta. Ad esempio, come simulerai esattamente lo stesso comportamento senza usare l'operatore +. C'è una funzione da usare? –

+0

Ah, capisco, aggiornato. – Prescott

+0

Devi lanciarlo in questo modo: 'SomeDelegate c = (SomeDelegate) Delegate.Combine (a, b);'? L'operatore + lo fa anche internamente? –

3

Si utilizza il metodo statico Delegate.Combine.

SomeDelegate c = Delegate.Combine(a, b) as SomeDelegate; 

Usando += operatore è lo stesso effettivamente.

// This is the same... 
eventSource.onEvent += OnEvent; 

// ...as this. 
eventSource.onEvent = Delegate.Combine(
    eventSource.onEvent, 
    Delegate.CreateDelegate(typeof(EventSource.OnEvent), this, "OnEvent") 
    ) as EventSource.OnEvent; 

MulticastDelegate classe (la classe dietro delegate parola chiave) hanno un elenco di invocazioni, ma questa lista è immutabile. Ogni volta che si combinano i delegati con l'operatore +=, viene creata una nuova istanza MulticastDelegate combinando l'elenco di chiamata degli ex due oggetti Delegato.