Lors de l'enchaînement de délégués .NET, comment les instances d'origine sont-elles utilisées?

StackOverflow https://stackoverflow.com/questions/638038

Question

Disons que j'ai le code C # suivant:

Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;
Les tests

indiquent que b n'est pas la même instance que c . Par conséquent, l'opérateur + semble créer une nouvelle instance du délégué. . est-ce une supposition correcte? Réutilise-t-il l’instance b en interne ou copie-t-il simplement les informations de méthode / cible sur une nouvelle instance?

Il semble que je ne sois pas en mesure de trouver l'implémentation de l'opérateur + pour les délégués, la classe Delegate ne semble pas la contenir.

Quelqu'un peut-il apporter des éclaircissements sur ce problème?

Je pose la question parce que je crée des classes qui se superposent comme des oignons, et la couche la plus externe appelle une couche interne, obtient des délégués, puis attache plus de méthodes à ces délégués. Je crains seulement que cela ne change en quelque sorte les délégués que j'obtiens du calque intérieur. Dans ce cas, je dois renvoyer des copies / clones au lieu de simplement les références internes.

Notez qu'il s'agit d'un code entièrement interne à ma bibliothèque. Par conséquent, même si je sais que la transmission de telles structures de données internes est une mauvaise idée en général, si je peux le faire en toute sécurité avec ces classes, je le ferai.

Était-ce utile?

La solution

Comme le dit Kent, + = utilise pour Delegate.Combine , et - = utilise Delegate.Remove . Consultez mon article sur les événements / délégués pour plus d'informations.

L'important, c'est que les délégués sont immuables - appeler Combiner / Supprimer ne change en rien le délégué sur lequel vous l'appelez - vous n'avez donc pas besoin de cloner quoi que ce soit. Il en va de même pour tout ce que vous faites avec le délégué: si vous obtenez la liste d'appels et modifiez le contenu du tableau renvoyé, par exemple, cela ne changera pas ce que fait réellement le délégué.

(C'est comme le comportement de String, si vous voulez une autre façon de penser.)

Autres conseils

+ = est équivalent à Delegate.Combine () . - = est équivalent à Delegate.Remove () . Chacun crée une nouvelle instance Delegate et la renvoie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top