types de structure devraient, chaque fois que possible, soit ont tous leur état encapsulé dans des domaines publics qui peuvent être indépendamment mis à toutes les valeurs qui sont valides pour leur type respectif, ou bien se comportent comme une seule valeur unique qui peut uniquement bet défini via constructor, factory, method, ou bien en passant une instance de la structure en tant que paramètre explicite ref
à l'une de ses méthodes publiques. Contrairement à ce que certains prétendent, il n'y a rien de mal dans une structure ayant des champs publics, si elle est censée représenter un ensemble de valeurs qui peuvent être soit manipulées individuellement soit transmises en groupe (par exemple les coordonnées d'un point). Historiquement, il y avait des problèmes avec les structures qui avaient des créateurs de propriétés publiques, et le désir d'éviter les champs publics (impliquant que les setters devraient être utilisés à la place) a conduit certaines personnes à suggérer que les structures mutables devraient être complètement évitées. problèmes que les propriétés avaient. En effet, une structure de champ exposé est la représentation idéale pour une collection de variables indépendantes, car est juste une collection de variables.
Dans votre exemple particulier, cependant, il semble que les deux champs de votre structure ne sont probablement pas supposés être indépendants. Il y a trois façons votre struct pourrait raisonnablement être conçue:
Vous pourriez avoir le seul champ public soit la chaîne, puis avoir une lecture seule « aide » propriété appelée length
qui compte sa longueur si la chaîne est non nul, ou renvoie zéro si la chaîne est nulle.Vous pouvez faire en sorte que la structure n'expose pas de champs publics, de paramètres de propriété ou de méthodes de mutation, et que le contenu du champ unique - une chaîne privée - soit spécifié dans le constructeur de l'objet. Comme ci-dessus, length
serait une propriété qui indiquerait la longueur de la chaîne stockée. Vous pouvez faire en sorte que la structure n'expose pas de champs publics, de paramètres de propriété ou de méthodes de mutation et possède deux champs privés: un pour la chaîne et un pour la longueur, tous deux définis dans un constructeur prenant une chaîne, le stocke, mesure sa longueur et stocke cela. La détermination de la longueur d'une chaîne est suffisamment rapide pour qu'il ne soit probablement pas utile de la calculer et de la mettre en cache, mais il peut être utile d'avoir une structure qui combine une chaîne et sa valeur GetHashCode
.
Il est important d'être au courant d'un détail en ce qui concerne la troisième conception, cependant: si le code non threadsafe provoque une instance de la structure à lire, tandis qu'un autre thread est en train d'écrire à elle, qui peut provoquer la création accidentelle d'une instance de structure dont les valeurs de champs sont incohérentes. Les comportements qui en résultent peuvent être légèrement différents de ceux qui se produisent lorsque les classes sont utilisées de manière non threadsafe. Tout code ayant un rapport avec la sécurité doit faire attention à ne pas supposer que les champs de structure seront dans un état cohérent, car un code malveillant - même dans un environnement de confiance totale - peut facilement générer des structures dont l'état est incohérent. il veut faire.
PS - Si vous souhaitez autoriser votre structure à initialiser à l'aide d'une cession d'une chaîne, je suggère d'utiliser un opérateur de conversion implicite et en faisant Length
une propriété en lecture seule qui retourne la longueur du sous-jacent chaîne si non nulle, ou zéro si la chaîne est nulle.
Veuillez ne pas créer de structures mutables. http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – Ani
'String's connaissent déjà leur longueur. Pourquoi auriez-vous besoin d'une structure comme celle-ci? –
@Karl Knechtel: Je suppose que c'est un exemple pour montrer le principe. Le code montré ne compile même pas ... – Guffa