Je travaille sur la création d'une classe immuable.
J'ai marqué toutes les propriétés en lecture seule.
J'ai une liste d'articles dans la classe.
Bien que si la propriété est en lecture seule, la liste peut être modifiée.
L'exposition de l'IEnumerable de la liste la rend immuable.
Je voulais savoir quelles sont les règles de base que l'on doit suivre pour rendre une classe immuable?
Je pense que vous êtes sur la bonne voie -
Pour être immuable, toutes vos propriétés et champs doivent être en lecture seule. Et les éléments de toute liste doivent eux-mêmes être immuables.
Vous pouvez créer une propriété de liste en lecture seule comme suit:
public class MyClass
{
public MyClass(..., IList<MyType> items)
{
...
_myReadOnlyList = new List<MyType>(items).AsReadOnly();
}
public IList<MyType> MyReadOnlyList
{
get { return _myReadOnlyList; }
}
private IList<MyType> _myReadOnlyList
}
N'oubliez pas non plus que:
public readonly object[] MyObjects;
n'est pas immuable même s'il est marqué avec un mot clé en lecture seule. Vous pouvez toujours modifier les références/valeurs de tableau individuelles par l'accesseur d'index.
Utilisez la classe ReadOnlyCollection
. Il est situé dans le System.Collections.ObjectModel
espace de noms.
Sur tout ce qui renvoie votre liste (ou dans le constructeur), définissez la liste comme une collection en lecture seule.
using System.Collections.ObjectModel;
...
public MyClass(..., List<ListItemType> theList, ...)
{
...
this.myListItemCollection= theList.AsReadOnly();
...
}
public ReadOnlyCollection<ListItemType> ListItems
{
get { return this.myListItemCollection; }
}
Une autre option serait d'utiliser un modèle de visiteur au lieu d'exposer des collections internes.