32 votes

Pourquoi les propriétés ne peuvent-elles pas être lues uniquement?

Cette question s'est posée dans les commentaires de cette réponse. L'incapacité d'avoir des propriétés en lecture seule a été proposé comme une des raisons possibles de l'utilisation de champs plutôt que des propriétés.

Par exemple:

class Rectangle
{
   private readonly int _width;
   private readonly int _height;

   public Rectangle(int width, int height)
   {
      _width = width;
      _height = height;
   }

   public int Width { get { return _width; } }
   public int Height { get { return _height; } }
}

Mais pourquoi tu ne peux pas faire cela?

public int Width { get; readonly set; }

Edit (interprétation): Vous pouvez obtenir cette fonctionnalité dans le premier exemple. Mais pourquoi ne pouvez-vous pas utiliser la fonction d'auto-mise en œuvre de la propriété d'abréviation pour faire la même chose? Il serait également plus propre, car vous n'auriez pas à accéder directement aux champs dans votre constructeur; tous les accès serait par le biais de la propriété.

24voto

itowlson Points 44174

Parce que la langue ne le permet pas.

Cela peut sembler frivole réponse: après tout, la langue, les concepteurs pourraient avoir déclaré que si vous avez utilisé readonly sur une automatique bien alors, ça voudrait dire "la propriété est réglable, mais seulement dans le constructeur".

Mais les caractéristiques ne viennent pas gratuitement. (Eric Gunnerson exprime en tant que "Toutes les fonctionnalités commence avec moins de 100 points.") À mettre en œuvre en lecture automatique uniquement les propriétés auraient exigé plus de compilateur effort pour soutenir la readonly modificateur sur une propriété (actuellement il s'applique uniquement aux champs), afin de générer l'appropriées champ de stockage et de transformation sets de la propriété en cas de cession à la sauvegarde de champ. C'est tout à fait un peu de travail à l'appui de quelque chose que l'utilisateur pourrait faire assez facilement par la déclaration d'une readonly champ de stockage et d'écrire une seule ligne de propriété de lecture, et que le travail serait un coût en termes de ne pas mettre en œuvre d'autres fonctionnalités.

Donc, tout à fait sérieusement, la réponse est que soit la langue, les concepteurs et les maîtres d'œuvre soit jamais pensé à l'idée, ou-plus probablement-ils pensé qu'il serait agréable d'avoir, mais a décidé il y avait de meilleurs endroits pour dépenser leurs ressources limitées. Il n'y a aucune contrainte technique qui empêche la langue des concepteurs et des maîtres d'œuvre en fournissant la fonctionnalité de vous suggérer: les raisons sont plus au sujet de l'économie du développement logiciel.

17voto

Ben McCormack Points 10669

Si vous souhaitez faire un propriété "lecture seule", pour autant que la fonctionnalité est concerné, vous le faites en fournissant uniquement le get méthode, comme vous l'avez indiqué dans votre post.

public int Width { get { return _width; } } 
public int Height { get { return _height; } } 

Le compilateur va même référence de ces en "lecture seule" si vous essayez d'écrire pour eux.

Avoir un terme additionnel de readonly pour une propriété qui serait en contradiction avec également fournir l' set méthode. Il semble être en mauvaise syntaxe pour moi, c'est à dire, comment la personne de le lire (ou le compilateur) à savoir ce qui l'emporte: readonly ou set?

En outre, comme il a été expliqué dans la réponse que vous l'avez mentionné, readonly s'applique uniquement aux champs et limites de l'écriture de ces champs à l'instanciation de la classe. Avec des propriétés, vous ne pouvez pas écrire (je ne pense pas), même dans le constructeur si ils ont seulement un get méthode.

9voto

Crippledsmurf Points 2796

Vous pouvez rendre une propriété automatique en lecture seule en spécifiant le modificateur d'accès privé pour l'ensemble comme ceci

 public bool Property {get; private set;}
 

Le setter est toujours défini mais il n'est plus visible en dehors de la classe où la propriété est définie. En passant, il est parfois utile de définir le setter comme interne afin que les propriétés puissent être facilement définies à partir du même assembly, mais pas par des appelants externes.

2voto

Nate Points 9879

Les propriétés peuvent être en lecture seule, tout simplement pas automatique propriétés.

Les deux get et set sont nécessaires pour le réglage automatique de propriétés, et il n'a pas de sens pour une propriété en lecture seule à avoir un set.

Vous pouvez définir un régulier de propriété comme une propriété en lecture seule par juste la définition de l' get - cependant, même si l'exigence pour les deux get et set automatique de propriétés n'existait pas, la propriété en lecture seule ne pouvait pas être défini automatiquement parce que vous avez à savoir la sauvegarde de champ pour être en mesure de définir sa valeur à l'interne (par le constructeur).

Je suppose qu'il pourrait être un modèle ou une macro ou quelque chose de défini dans VS pour générer le code, mais il ne pouvait pas être une partie de la langue elle-même.

1voto

tvanfosson Points 268301

Je pense que, fondamentalement, le problème est que les propriétés sont simplement du sucre syntaxique pour un champ facultatif getter/setter. Automatique des propriétés de générer le champ de stockage de sorte qu'ils nécessitent le "setter" ou il n'y aurait aucun moyen de définir la valeur du champ de stockage. Puisque les propriétés vraiment sur la carte de méthodes, champs, il ne ferait aucun sens de les rendre readonly.

Même si c'est permis, en lecture seule ne peut s'appliquer qu'à automatique de propriétés. Pour les propriétés classiques, vous pouvez mettre du code arbitraire à la fois le getter et le setter. Même si le setter ont pu être invoquée que dans le constructeur de la classe, de la lecture pourrait encore muter la valeur fondée sur quelle logique vous avez décidé de mettre en elle. Ce serait totalement incompatible avec le concept de lecture seule, ce qui nécessite différentes règles de syntaxe et de soutien automatique/propriétés classiques. Puisqu'il y a un mécanisme -- à l'aide de propriétés classiques avec seulement une lecture définie ET un readonly la sauvegarde de champ comme dans l'référencé question -- je ne vois pas en marinage vers le haut de la syntaxe de la propriété et, potentiellement, d'introduire de la confusion pour quelque chose avec assez facile et simple de mise en œuvre à l'aide de la langue en cours de constructions.

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