Criei uma propriedade automatizada:
public int Foo { get; }
Isso é apenas getter. Mas quando eu construo um construtor, posso mudar o valor:
public MyClass(string name)
{
Foo = 5;
}
Por que isso é possível, embora seja apenas para obter?
Respostas:
Este é um novo recurso do C # 6, "propriedades automáticas somente de obtenção", também conhecido como "Inicializadores de propriedade automática para propriedades somente leitura", conforme discutido neste artigo da revista MSDN 'C #: The New and Improved C # 6.0' por Mark Michaelis e na especificação da linguagem de rascunho do C # 6.0 .
O setter do campo somente leitura é acessível apenas no construtor; em todos os outros cenários, o campo ainda é somente leitura e se comporta como antes.
Esta é uma sintaxe de conveniência para reduzir a quantidade de código que você precisa digitar e para remover a necessidade de declarar explicitamente uma variável de nível de módulo privado para conter o valor.
Esse recurso foi visto como importante porque, desde a introdução das propriedades implementadas automaticamente no C # 3, as propriedades mutáveis (aquelas com um getter e setter) tornaram-se mais rápidas de escrever do que as imutáveis (aquelas com apenas um getter), o que significa que as pessoas eram ser tentado a usar propriedades mutáveis para evitar ter que digitar o código para um campo de apoio geralmente necessário para propriedades somente leitura. Há mais discussão sobre as propriedades implementadas automaticamente na seção relevante do Guia de programação do Microsoft C # .
Esta postagem do blog, '# 1.207 - C # 6.0 - Inicializadores de propriedade automática para propriedades somente leitura', de Sean Sexton, tem uma boa explicação e um exemplo como segue:
Mais detalhes também podem ser encontrados no repositório dotnet Roslyn no GitHub :
e na especificação de linguagem de rascunho C # 6.0 (NB: A especificação de linguagem é final no que diz respeito à Microsoft, mas ainda não foi aprovada como um padrão EMCA / ISO , daí o 'rascunho'):
fonte
CS0200 C# Property or indexer cannot be assigned to -- it is read only
ao usar uma propriedade regular. As "propriedades automáticas somente getter" são consideradas somente leitura ou não?Este é um novo recurso no C # 6 que permite criar propriedades somente leitura e inicializar seus valores a partir do construtor (ou embutido quando você os declara).
Se você tentar alterar o valor desta propriedade fora do construtor, ocorrerá um erro de compilação.
É somente leitura no sentido de que, depois de inicializar seu valor (embutido ou dentro do construtor), você não pode alterar seu valor.
fonte
Se não fosse possível inicializar a propriedade somente leitura do construtor (ou um inicializador de propriedade automática), seria inútil, pois sempre retornaria o valor padrão para seu tipo (0 para números, nulo para tipos de referência ) A mesma semântica aplicada a campos somente leitura em todas as versões C #.
Para definir uma propriedade somente getter verdadeira (que não pode ser inicializada a partir do construtor), você precisa especificar o que ela retorna como parte da definição:
Ou, de forma mais concisa em C # 6:
fonte
“Propriedades implementadas automaticamente somente leitura”
Em primeiro lugar, quero esclarecer que a propriedade como
É conhecido como “propriedades implementadas automaticamente somente leitura”
Para verificar isso, você pode executar e verificar o código acima com o Visual Studio. Se você alterar a versão do idioma de C # 6.0 para C # 5.0, o compilador lançará a seguinte exceção recurso 'propriedades implementadas automaticamente somente leitura' não está disponível em C # 5. Use a versão de idioma 6 ou superior.
para alterar a versão do idioma C # visite aqui
Agora estou indo para sua segunda pergunta
“Este é apenas getter. Mas quando eu construo um construtor, posso mudar o valor ”
A Microsoft apresenta as “propriedades implementadas automaticamente somente leitura” na lógica de somente leitura. Como sabemos, a palavra-chave “somente leitura” está disponível em C # 1.0. usamos a palavra-chave "somente leitura" como modificador em um campo e esse campo pode ser atribuído de 2 maneiras , no momento da declaração ou em um construtor na mesma classe.
Da mesma forma, o valor de "propriedades implementadas automaticamente somente leitura" pode ser atribuído de 2 maneiras
Way1 (no momento da declaração):
Way2 (em um construtor da mesma classe)
Propriedade puramente somente leitura
Se você está procurando uma propriedade somente leitura, vá para esta
agora você não pode atribuir o valor da propriedade “FullName” do construtor. Se você tentar fazer isso, as seguintes exceções serão lançadas
“Propriedade ou indexador 'Person.FullName' não pode ser atribuído - é somente leitura”
fonte
O recurso de propriedade automática foi adicionado à linguagem durante o lançamento do C # 3.0. Ele permite que você defina uma propriedade sem nenhum campo de apoio, no entanto, você ainda precisa usar o construtor para inicializar essas propriedades automáticas com o valor não padrão. C # 6.0 introduz um novo recurso chamado inicializador de propriedade automático, que permite inicializar essas propriedades sem um construtor como a seguir:
Você pode encontrar mais informações sobre isso aqui
fonte
Uma variável declarada
readonly
pode ser escrita dentro de um construtor, mas em linguagens que respeitam o atributo, não pode ser modificada após o retorno do construtor. Esse qualificador foi fornecido como um recurso de linguagem porque muitas vezes é necessário para campos cujos valores variam com base nos parâmetros do construtor (o que significa que eles não podem ser inicializados antes do início do construtor), mas não terão que mudar após o retorno dos construtores, mas foi utilizável apenas para variáveis expostas como campos. A semântica dereadonly
campos -qualified seria, em muitos casos, perfeita para membros públicos, exceto que geralmente é melhor para as classes expor os membros - mesmo os imutáveis - como propriedades em vez de campos.Assim como as propriedades automáticas de leitura e gravação existem para permitir que as classes exponham propriedades mutáveis tão facilmente quanto os campos comuns, as propriedades automáticas somente leitura existem para permitir que as classes exponham propriedades imutáveis tão facilmente quanto os
readonly
campos qualificados. Assim como osreadonly
campos -qualified podem ser escritos em um construtor, o mesmo ocorre com as propriedades get-only.fonte