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: p> 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 em>; 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. P> suis-ce que je manque quelque chose d'évident ici? P> p>
5 Réponses :
vous êtes correct; Il copie la référence. P>
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. P>
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. P>
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. P>
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!
Ceci est aussi de MSDN .. P>
"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
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();
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?