117 votes

Comment mettre en œuvre une propriété en lecture seule ?

Je dois mettre en œuvre un en lecture seule de mon type. De plus, la valeur de cette propriété sera définie dans le constructeur et ne sera pas modifiée (j'écris une classe qui expose des commandes d'interface utilisateur personnalisées pour WPF, mais cela n'a pas d'importance).

Je vois deux façons de procéder :

  1. class MyClass { public readonly object MyProperty = new object(); }

  2. class MyClass { private readonly object my_property = new object(); public object MyProperty { get { return my_property; } } }

Avec toutes ces erreurs de FxCop disant que je ne devrais pas avoir de variables membres publiques, il semble que la seconde soit la bonne façon de faire. Est-ce correct ?

Y a-t-il une différence entre une propriété en lecture seule et un membre en lecture seule dans ce cas ?

7voto

owns Points 131

D'une autre manière encore (ma préférée), en commençant par C# 6

private readonly int MyVal = 5;

public int MyProp => MyVal;

https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties#expression-body-definitions

5voto

Eric Mickelsen Points 6332

Je suis d'accord pour dire que la deuxième solution est préférable. La seule véritable raison de cette préférence est la préférence générale pour que les classes .NET n'aient pas de champs publics. Toutefois, si ce champ est en lecture seule, je ne vois pas comment il pourrait y avoir de réelles objections autres qu'un manque de cohérence avec d'autres propriétés. La véritable différence entre un champ en lecture seule et une propriété en lecture seule est que le champ en lecture seule garantit que sa valeur ne changera pas au cours de la vie de l'objet, ce qui n'est pas le cas d'une propriété en lecture seule.

4voto

Joshua Rodgers Points 2932

La deuxième méthode est préférable en raison de l'encapsulation. Vous pouvez certainement rendre public le champ en lecture seule, mais cela va à l'encontre des idiomes C# dans lesquels l'accès aux données se fait par l'intermédiaire des propriétés et non des champs.

Le raisonnement sous-jacent est que la propriété définit une interface publique et que si l'implémentation de cette propriété est modifiée, le reste du code n'est pas interrompu car l'implémentation est cachée derrière une interface.

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