7
votes

C # Copie de la variable de la variable locale dans les fonctions de même classe

J'ai récemment examiné du code sur un projet open source et j'ai trouvé de nombreuses occurrences de ce type de code: xxx

existe-t-il un bénéfice réel pour faire une copie de la variable d'instance ?


4 commentaires

Un avantage est la sécurité du fil libre


Ce n'est pas aussi typique de voir ce modèle utilisé pour la copie d'un champ entier, mais je vois et utilisez-le souvent lors de la référencement des champs pouvant être définis sur NULL sur un autre fil. Ce n'est qu'une petite partie d'une conception de fil-coffre-fort, mais cela est important pour empêcher les conditions de course difficiles à trouver.


@Dan: Ou, pour créer des conditions de course difficiles à trouver. Lorsque vous faites une copie, vous venez de vous retrouver avec une course différente . Maintenant, la course est que la copie est faite, puis la valeur d'origine est modifiée, et la fonction est désormais un calcul sur les données stables.


@ERIC, c'est un bon point ... Je pense que dans la plupart des cas, j'ai utilisé cela, il est logique d'utiliser les données obsolètes (telles que l'appel d'un événement), mais je pouvais voir cela être un problème si la valeur copiée avait été disposé sur un autre fil, par exemple.


6 Réponses :


0
votes

Le seul avantage que je vois consiste à avoir une "version réadonn" de la variable juste pour cette méthode


0 commentaires

8
votes

Non, sauf si vous ne souhaitez pas modifier la valeur de Somenumumber et que vous avez l'intention de mettre à jour SomenumberCopy. Comme si vous alliez boucler le nombre de fois et allait décrémenter somenumbercopy à zéro pour garder une trace du compte.

Je suppose que la copie de la variable comme celle-ci pourrait vous protéger de certaines fonctions extérieures altérant somenumber et la modifier sans vos connaissances tout en effectuant une opération. Je pourrais potentiellement voir cela si la classe était censée être utilisée dans une application multi-threadée. Peut-être que je ne voudrais pas y aller, mais cela aurait pu être l'intention de l'auteur.


0 commentaires

1
votes

est le // ... faites-le travailler avec SomenumberCopy faire quelque chose avec SomenumberCopy? Est-ce que cela change la valeur? Est-il passé à une méthode qui pourrait changer la valeur?

Si non alors non, il n'y a pas d'avantage.


0 commentaires

10
votes

Peut-être que cela fait partie du programme multi-threadé. Bien que ce code ne soit pas le fil-coffre-fort, il garantit qu'une variable une fois que la variable de copie est attribuée, elle n'est pas modifiée par un autre threads, et tous les codes de fonction suivant une manière constante.

code similaire avec des événements devient critique dans l'environnement multi-fileté: P>

MyEvent e = this.myEvent;

if ( e != null )
{
    e();
}


1 commentaires

Je n'ai même pas pensé à la multi-fileté lorsque je cherchais le code, merci donc de votre réponse. Après avoir regardé en arrière, il s'avère que l'utilisation réelle est que la variable d'instance est déjà réadaptée et définie par le constructeur, et la valeur n'est pas modifiée. Il me semble maintenant que cela peut avoir été fait pour changer le nom de la variable afin que le code se lit plus facile.



1
votes

Vous avez laissé de côté quelques détails importants.
Si vous avez plusieurs threads accédant à un somenumber et ce scénario: xxx

alors il est important de faire une copie.


0 commentaires

1
votes

Il pourrait être utile si this.somenumumber peut être modifié par un autre thread, mais pour la durée de cette méthode, il est essentiel que le somenumbercopy ne puisse pas être modifié (il Peut être hors de synchronisation avec somenumber ) alors cela pourrait être viable, sinon je ne vois pas une raison pour cela.


0 commentaires