Sim, os dois são somente leitura, mas há uma diferença. No primeiro, há um campo de apoio que é inicializado como 0 antes que o construtor seja executado. Você pode alterar o valor apenas no construtor , assim como um campo somente leitura regular. O getter em si apenas retorna o valor do campo.
No segundo, o getter retorna 0 sempre, sem campo envolvido.
Portanto, para evitar o uso de propriedades implementadas automaticamente ou de membros com expressão, temos:
Primeira versão
private readonly int _number = 0;
public int Number { get { return _number; } }
Segunda versão
public int Number { get { return 0; } }
Um exemplo mais claro da diferença pode ser visto assim:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Se você criar um único objeto, sua CreationTime
propriedade sempre fornecerá o mesmo resultado - porque é armazenada em um campo somente leitura, inicializado na construção do objeto. No entanto, toda vez que você acessar a CurrentTime
propriedade, isso fará com DateTime.UtcNow
que seja avaliado, para que você obtenha um resultado potencialmente diferente.
random.NextInt()
. A primeira versão avaliará isso uma vez e sempre terá o mesmo valor. O segundo retornará um novo valor a cada vez.Uma diferença é quando isso
0
é avaliado: na criação do objeto ou quando a propriedade é usada.Você pode ver isso melhor com as propriedades DateTime:
A
Start
propriedade continua retornando no mesmo horário (de quando a instância foi criada), enquantoNow
muda para refletir o horário atual.Explicação :
A primeira versão ("Iniciar") fornece um valor inicial que pode até ser substituído pelo construtor. Portanto, isso é avaliado apenas uma vez.
A segunda versão ("Now") fornece a expressão que será o "getter" dessa propriedade. Portanto, isso é avaliado toda vez que a propriedade é lida. Não existe nem um campo de apoio que o construtor possa sobrescrever.
fonte
Esses são os recursos de linguagem C # 6.
Primeiro exemplo
O primeiro exemplo é uma propriedade automática somente getter . O campo de apoio de uma propriedade automática somente para getter é declarado implicitamente como somente leitura.
Segundo exemplo
E o segundo exemplo são corpos de expressão em membros de funções semelhantes a propriedades . Observe que não há nenhuma
get
palavra-chave: está implícita no uso da sintaxe do corpo da expressão.Ambos são somente leitura.
fonte