Respostas:
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.
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:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
A Start
propriedade continua retornando no mesmo horário (de quando a instância foi criada), enquanto Now
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.
Esses são os recursos de linguagem C # 6.
Primeiro exemplo
public int Number { get; } = 0
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
public int Number => 0;
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.
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.