Estoy trabajando para crear una clase inmutable.
He marcado todas las propiedades como de solo lectura.
Tengo una lista de elementos de la clase.
Aunque si la propiedad es de solo lectura, la lista se puede modificar.
Exponer el IEnumerable de la lista lo hace inmutable.
Quería saber cuáles son las reglas básicas que se deben seguir para que una clase sea inmutable.
c#
.net
immutability
Biswanath
fuente
fuente
atomicity
,volatility
yimmutability
: Primera parte , Segunda Parte y la Parte Tres . Estos son de su blog personal y, creo, más amigables para los novatos que sus publicaciones de MSDN.Respuestas:
Creo que estás en el camino correcto
fuente
Para ser inmutable, todas sus propiedades y campos deben ser de solo lectura. Y los elementos de cualquier lista deberían ser inmutables.
Puede crear una propiedad de lista de solo lectura de la siguiente manera:
fuente
basic rules to make a class (that contains a list) immutable
. La semántica ImmutableList permite un uso de memoria más eficiente al agregar elementos a una copia de la lista, pero me parece que ese es un caso de uso más específico.Además, tenga en cuenta que:
no es inmutable incluso si está marcado con una palabra clave de solo lectura. Aún puede cambiar referencias / valores de matriz individuales por medio de acceso de índice.
fuente
Usa la
ReadOnlyCollection
clase. Está situado en elSystem.Collections.ObjectModel
espacio de nombres.En cualquier cosa que devuelva su lista (o en el constructor), configure la lista como una colección de solo lectura.
fuente
Otra opción sería utilizar un patrón de visitante en lugar de exponer ninguna colección interna.
fuente
El uso de ReadOnlyCollection impedirá que el cliente lo modifique.
fuente