Estou trabalhando na criação de uma classe imutável.
Marquei todas as propriedades como somente leitura.
Eu tenho uma lista de itens da aula.
Embora se a propriedade for somente leitura, a lista pode ser modificada.
Expor o IEnumerable da lista o torna imutável.
Eu queria saber quais são as regras básicas que devem ser seguidas para tornar uma classe imutável.
c#
.net
immutability
Biswanath
fonte
fonte
atomicity
,volatility
, eimmutability
: Parte I , Parte II e Parte III . Estas são de seu blog pessoal e, acredito, mais amigável para novatos do que seus posts MSDN.Respostas:
Acho que você está no caminho certo -
fonte
Para serem imutáveis, todas as suas propriedades e campos devem ser somente leitura. E os itens em qualquer lista devem ser imutáveis.
Você pode criar uma propriedade de lista somente leitura da seguinte maneira:
fonte
basic rules to make a class (that contains a list) immutable
. A semântica de ImmutableList permite um uso de memória mais eficiente ao adicionar itens a uma cópia da lista, mas isso me parece um caso de uso mais específico.Além disso, lembre-se de que:
não é imutável, mesmo se estiver marcado com a palavra-chave somente leitura. Você ainda pode alterar referências / valores de array individuais por acessador de índice.
fonte
Use a
ReadOnlyCollection
classe. Ele está situado noSystem.Collections.ObjectModel
namespace.Em qualquer coisa que retorne sua lista (ou no construtor), defina a lista como uma coleção somente leitura.
fonte
Outra opção seria usar um padrão de visitante em vez de expor qualquer coleção interna.
fonte
Usar ReadOnlyCollection impedirá que o cliente o modifique.
fonte