Je pensais qu'un exemple de délégué était interchangeable avec une instance de fonction.
Prendre le code suivant: p> Les deux manières de l'appeler semblent être équivalents, et Si vous utilisez uniquement C #, vous ne verrez jamais la différence (au moins, je n'ai pas jusqu'à présent point). Cependant, j'ai récemment été un code non géré qui remontait dans ce code géré, ils sont traités différemment. Par exemple, dans un scénario, je dois obtenir l'erreur "Un rappel a été effectué sur une déléguée collectée aux ordures" si j'utilise la fonction directement comme rappel (même si mon instance d'objet est conservée). L'utilisation de la "instance de délégué" corrige le problème. P> Y a-t-il quelqu'un qui sait quelle est la différence? P> p>
3 Réponses :
Alors que les délégués fournissent des fonctionnalités synonymes en C # comme pointeurs de fonction en C ou C ++, il existe des différences significatives. Parmi celles-ci, c'est que Un délégué est une classe forte>, pas un pointeur. p>
En bref, la coulée d'un délégué à un pointeur ne va pas vous faire référence à une fonction ou à une méthode, et comme elle ne peut pas être utilisée pour appeler une méthode par référence à partir de code non géré. P>
Corrérétion de terminologie: au lieu d'un pointeur de méthode, plus le terme est approprié est un groupe de méthodes. p>
en termes de fonctionnalité, les deux déclarations sont équivalentes. C'est-à-dire qu'ils produisent Dans le premier cas, vous passez le groupe de méthodes Ajouter à la méthodeThattakaAjouter directement. Cela provoque la création d'une valeur de déléguée temporaire et ensuite transmise à la méthodeThatTarsAjouter. Cette valeur de délégation est soumise à la collecte des ordures au moment où la méthodeThatTakeAdd revient depuis qu'il ne stocke pas la valeur. P>
Dans le second cas, vous avez attribué le délégué à un champ de l'instance extérieure. Cela va généralement em> augmentera la durée de vie du délégué et réduisez donc les risques que celles-ci sont recueillies lors de votre appel à Pinvoke. p>
Cela semble très plausible et expliquerait ce que je vois!
msdn.microsoft.com/en-us/magazine/cc164193.cox l'explique dans la section "Inverse p / invoke et délégué à vie"
@Jarededpar Je ne comprends pas. Est-ce que ce addDelegate déléguées; code> est un délégué instance b> ?? C'est juste une variable de type
addDelegate code>. Il semble logique qu'un délégué instance b> serait le côté droit b> de
mydel + = nouveau mydel (myMethod); code> - ou
mydel + = MyMethod; Code> (en bref) ..... je me trompe?
Les délégués sont des classes appelables et ont des comportements forts> forts> aux pointeurs de fonction. Le délégué stocke en interne l'adresse de la fonction à appeler (c'est-à-dire le pointeur de la fonction), mais fournit également d'autres fonctionnalités telles que la multi-casting et le stockage d'une liste d'invocation; Vous pouvez essentiellement invoquer de nombreuses fonctions de la même signature avec une instance de déléguée comme suit. concernant votre note sur l'équivalence de MethodTattakesAjouter (add) code> et
MéthodeTatablesAjouter (DélégationInstance) Code>,
Si vous regardez le MSIL que le compilateur C # génère pour la ligne
MethodTattakesAjouter (add) code>, vous remarquerez que le compilateur crée un délégué et enveloppe la méthode
Ajouter () Code> pour vous. P> p>
À quoi ressemble l'IL? Y a-t-il une indication "sous la hotte" qu'elles seraient normalement traitées différemment?