11
votes

Copier des délégués

Je ne faisais que lire une page sur événements sur MSDN, et Je suis tombé sur un extrait d'exemple de code qui me déroule.

Le code en question est-ce: xxx

Je comprends les intentions du code, mais je ne sais pas de Voyez comment cette ligne particulière fait une copie de n'importe quoi. Tout ce qu'il fait est de copier la référence ; Cela ne fait pas une copie profonde de l'instance de délégué. Donc, à cette fin, cela n'empêche pas du tout la condition de race.

suis-ce que je manque quelque chose d'évident ici?


1 commentaires

Peut-on régler les risées pour NULL sur un fil différent avant la méthode actuelle a la chance de le déclencher?


5 Réponses :


5
votes

vous êtes correct; Il copie la référence.

Cependant, les délégués sont immuables; Lorsque vous ajoutez un gestionnaire à un événement, un nouveau délégué est créé, combinant le (s) gestionnaire (s) actuel (s) avec le nouveau et est ensuite attribué au champ.

L'instance de déléguée que le champ fait référence ne peut pas changer, donc cela évite la condition de course.


0 commentaires

18
votes

Les délégués sont immuables, la référence obtenue dans ce code est garantie de ne pas changer. Si un utilisateur abonna ou désabonnez-vous après la vérification NULL, un nouveau délégué sera créé et défini sur l'événement. Cependant, puisque vous avez une référence à un objet complètement différent et invoquez cela, vous n'avez pas à vous soucier d'être nul.


1 commentaires

Ahh ok qui fait beaucoup plus de sens, merci! Je dois dire que je suis impressionné par la rapidité avec laquelle cela a été répondu!



3
votes

Eric Lippert déjà couvert cela dans un POST .


0 commentaires

1
votes

Ceci est aussi de MSDN ..

"La liste d'invocation d'un délégué est un ensemble ordonné de délégués dans lesquels chaque élément de la liste invoque exactement l'une des méthodes représentées par le délégué. une liste d'invocation peut contenir des méthodes en double. Pendant Une invocation, des méthodes sont invoquées dans l'ordre dans lequel elles apparaissent dans la liste d'invocation. Un délégué tente d'invoquer chaque méthode dans sa liste d'invocation; les doublons sont invoqués une fois pour chaque fois qu'ils apparaissent dans la liste des invocalités. Les délégués sont immuables; une fois créé, la liste d'invocation d'un délégué ne change pas. "


0 commentaires

0
votes

si (quoi que ce soit! = null) quoi que ce soit (); code> on dirait qu'il garantit que quel que soit code> n'est jamais null lorsque est appelé () code> est appelé , mais cela ne garantit pas en fait que dans un scénario fileté. Un thread différent peut définir peu importe = null code> entre le chèque et l'appel.

Foo temp = whatever;
if (temp != null) temp();


0 commentaires