Type immuable et propriété en C#
3 réponses
un type immuable est un type dont les propriétés ne peuvent être définies qu'à l'initialisation. Une fois qu'un objet est créé, rien ne peut plus être modifié. Une propriété immuable est simplement une propriété en lecture seule.
dans l'exemple suivant, ImmutableType
est un type immuable avec une propriété Test
. Test est une propriété en lecture seule. Il ne peut être réglé que dans la construction.
class ImmutableType
{
private readonly string _test;
public string Test
{
get { return _test; }
}
public ImmutableType(string test)
{
_test = test;
}
}
Voir Aussi : Article Wikipedia , et certains Pile Dépassement de questions sur le sujet.
fretje est correct. L'exemple le plus populaire d'un type immuable est un objet string
dans C#. C'est la raison pour laquelle StringBuilder
existe.
en plus de la réponse de @fretje ci-dessus, dans C#6 et plus tard, getter-only auto properties ont maintenant été mis en œuvre, ce qui permet d'immuables auto-propriétés sans la nécessité de l'explicite supplémentaire private readonly
champ de soutien. Le code équivalent serait Abrégé en:
class ImmutableType
{
public string Test
{
get; // No Set at all, not even a private set.
}
public ImmutableType(string test)
{
Test = test; // The compiler understands this and initializes the backing field
}
}
notez que private set
(le plus proche de l'immutabilité pourrait obtenir en utilisant des propriétés auto dans les versions précédentes de C#) fournit seulement une restriction encapsulation de changement à la propriété de l'intérieur de la même classe, et n'est donc pas vraiment immuable:
public string Test
{
get;
private set; // Not immutable, since this is still mutable from within the class
}
pour en savoir plus sur l'immutabilité
comme d'autres l'ont dit, une immutable Property
est une propriété qui ne peut pas changer une fois qu'elle a été définie. Réglage de la seule "valeur" est généralement fait dans le constructeur.
un immutable Type
est un type où toutes les propriétés (extérieurement visibles) et tous les champs sont immuable-par exemple le Type" Record "initialement prévu pour C#7 (avec un peu de chance maintenant 8) aurait été un type immuable. D'autres exemples de Types immuables sont Tuples
, et tous classes anonymes .
les champs immuables doivent être qualifiés avec le mot-clé readonly
dans C# - ceci est forcé par le compilateur pour s'assurer qu'aucun autre code ne tente de changer le champ en dehors de la constructeur.
dans la mesure du possible, l'immuabilité des champs, des variables et des propriétés est considérée comme une bonne pratique, car elle réduit considérablement la surface des bogues (puisque les champs représentent l'état d'un objet, empêcher le changement de champs réduit le nombre d'États).
l'avantage de l'immutabilité est particulièrement important dans les programmes multi-threads, où deux ou plusieurs threads accèdent simultanément au même objet. Depuis plusieurs concurrents la lecture des threads permet d'accéder en toute sécurité à la valeur d'un champ ou d'une propriété, le programmeur n'a pas besoin de se préoccuper des problèmes de sécurité des threads liés au changement de champ par d'autres threads.
un inconvénient commun de l'immutabilité dans le traitement des objets complexes constitués d'objets composés multiples, est que le graphe entier doit être construit 'en une seule fois', ce qui peut conduire à du code confus. Une solution courante ici est d'utiliser le modèle de constructeur comme un échafaudage, qui permet une représentation transitoire et mutable à construire par étapes, puis l'objet final, immuable est obtenu dans l'étape finale .Build()
.