278 votes

Quels sont les avantages d’un champ de marquage comme « readonly » en c# ?

Quels sont les avantages d’avoir une variable membre déclarée comme lecture seule ? Il protège seulement contre une personne changeant au cours du cycle de vie de la classe ou y a-t-il n’importe quel compilateur des améliorations de vitesse en raison de ce mot-clé

189voto

JaredPar Points 333733

Je ne crois pas qu'il existe des gains de performance de l'aide d'un champ en lecture seule. C'est tout simplement une vérification pour s'assurer qu'une fois que l'objet est entièrement construit, que le champ ne peut pas être pointé vers une nouvelle valeur.

Cependant "readonly" est très différent des autres types de lecture seule sémantique parce qu'il est appliqué au moment de l'exécution par le CLR. Le mot clé readonly compile vers le bas .initonly qui est vérifiable par le CLR.

L'avantage réel de ce mot clé est de générer des données immuables structures. Immuable structures de données, par définition, ne peut pas être changé une fois construits. De ce fait, il est très facile de raisonner sur le comportement d'une structure à l'exécution. Par exemple, il n'existe aucun risque de passage d'un immuable d'une structure à l'autre aléatoire portion de code. Ils ne peuvent pas changé, si vous pouvez programmer de manière fiable à l'encontre de cette structure.

Ici, c'est un bon point d'entrée sur l'un des avantages de l'immuabilité: Filetage

165voto

Bill the Lizard Points 147311

L' readonly mot-clé est utilisé pour déclarer une variable membre d'une constante, mais permet à la valeur calculée au moment de l'exécution. Ceci diffère d'une constante déclarée avec l' const modificateur, qui doit avoir la valeur est définie au moment de la compilation. À l'aide de readonly vous pouvez définir la valeur du champ dans la déclaration, ou dans le constructeur de l'objet que le champ est un membre de.

Aussi l'utiliser si vous ne voulez pas avoir à recompiler externe Dll qui font référence à la constante (car il est remplacé au moment de la compilation).

64voto

Xiaofu Points 6163

Il n'y a pas apparent des avantages de performance à l'aide d' readonly, au moins aucun que j'ai jamais vu mentionné nulle part. C'est juste pour faire exactement comme vous le suggérez, pour empêcher la modification une fois qu'il a été initialisé.

Il est donc avantageux, car il vous permet d'écrire plus robuste, plus lisible le code. Le réel avantage de ce genre de choses viennent quand vous travaillez dans une équipe ou pour l'entretien. Déclarer que quelque chose comme readonly s'apparente à l'élaboration du contrat pour que l'utilisation de la variable dans le code. Il pense que l'ajout de la documentation, de la même manière que les autres mots-clés comme internal ou private,, vous dites "cette variable ne doit pas être modifié après l'initialisation", et de plus vous êtes à l'application .

Donc, si vous créez une classe et de la marque de certains des membres les variables readonly par la conception, alors vous empêcher de vous-même ou un autre membre de l'équipe de faire une erreur, plus tard, lorsqu'ils sont d'une expansion ou la modification de votre classe. À mon avis, c'est un avantage de la valeur (à la petite dépense supplémentaire de complexité du langage comme doofledorfer mentionne dans les commentaires).

49voto

Daniel Auger Points 8459

Pour le dire en termes très concrets :

Si vous utilisez un const dans dll A et dll B fait référence que const, la valeur de cette volonté const être compilé dans une dll B. Si vous redéployez dll A avec une nouvelle valeur pour que const, dll B utilise toujours la valeur d’origine.

Si vous utilisez un readonly dans dll A et dll B référence que readonly, que readonly sera toujours être consulté lors de l’exécution. Cela signifie que si vous redéployez dll A avec une nouvelle valeur pour que readonly, dll B utilise cette nouvelle valeur.

9voto

Brian Rasmussen Points 68853

Gardez à l’esprit que readonly s’applique uniquement à la valeur elle-même, donc si vous utilisez un référence type readonly ne protège que la mention du changement. L’état de l’instance n’est pas protégé par readonly.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X