Comment l’opérateur + travaille-t-il pour combiner des delegates?

Par exemple:

delegate void SomeDelegate(); SomeDelegate a = new SomeDelegate( () => Console.WriteLine("A") ); SomeDelegate b = new SomeDelegate( () => Console.WriteLine("B") ); SomeDelegate c = a + b; 

Dans la dernière ligne, à quoi a + b ? Je suis juste curieux de savoir comment je les appendais sans utiliser l’opérateur + .

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx – Rechercher un ajout:

Un délégué peut appeler plus d’une méthode lorsqu’il est appelé. Ceci est appelé multidiffusion. Pour append une méthode supplémentaire à la liste de méthodes du délégué, la liste d’invocation, vous devez simplement append deux delegates à l’aide des opérateurs d’ajout ou d’affectation supplémentaire (‘+’ ou ‘+ =’). Par exemple:

 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; 

À ce stade, allMethodsDelegate contient trois méthodes dans sa liste d’appels: Method1, Method2 et DelegateMethod. Les trois delegates d’origine, d1, d2 et d3, restnt inchangés. Lorsque allMethodsDelegate est appelé, les trois méthodes sont appelées dans l’ordre. Si le délégué utilise des parameters de référence, la référence est transmise séquentiellement à chacune des trois méthodes, et toute modification d’une méthode est visible pour la méthode suivante. Lorsque l’une des méthodes lève une exception qui n’est pas interceptée dans la méthode, cette exception est transmise à l’appelant du délégué et aucune méthode ultérieure de la liste d’appels n’est appelée.

Mettre à jour

Les deux delegates proviennent de System.Delegate. Vous pouvez utiliser les méthodes combine() pour append deux delegates.

Ceci est fait en utilisant la méthode statique Delegate.Combine .

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

En utilisant l’opérateur += , c’est exactement la même chose.

 // 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 MulticastDelegate (la classe derrière le mot clé delegate ) possède une liste d’appels, mais cette liste est immuable. Chaque fois que vous combinez des delegates avec l’opérateur += , une nouvelle instance MulticastDelegate est créée, qui combine la liste d’appels des deux anciens objects Delegate.