c #: getter / setter

109

Eu vi algo como o seguinte em algum lugar e estava me perguntando o que significava. Eu sei que eles são getters e setters, mas quero saber por que o tipo de string é definido assim. Obrigado por me ajudar.

public string Type { get; set; }
Maia
fonte
4
Isso é chamado de propriedade automática, dê uma olhada em: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov
Esta é a definição de uma propriedade chamada "Type", o tipo .NET que é System.string. Não há nada mais nisso.
Jon
2
Acho que ele pode estar confundindo a nomenclatura da Auto-Property com a classe System.Type do Reflection. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Respostas:

178

Essas são propriedades implementadas automaticamente (propriedades automáticas para abreviar).

O compilador irá gerar automaticamente o equivalente à seguinte implementação simples:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}
Justin Niessner
fonte
2
@barlop como alguém vindo do google, sem ideia, o que precisa ser atualizado? M. Hassans responde o que você quer dizer? obrigado.
Etenosidade
1
@Aethenosity em retrospecto, acho que está tudo bem .. Eu estava pensando em termos de exemplos de getter setter. O questionador tem um caso válido de getter setter que é muito mais sucinto (como um forro / nenhum segundo campo necessário). Você também pode escrever public int b { get { return b * 2; } } nenhum segundo campo necessário. Mas eu acho que quando você tem o levantador com um corpo, você precisa do segundo campo. E este mostra um levantador com corpo. Embora faça o mesmo que o único forro do questionador.
barlop
2
@Aethenosity também há c # 7, por meio do qual você ainda precisa do segundo campo quando o setter tem um corpo, mas tem uma =>sintaxe e nenhuma palavra-chave de retorno. Embora não fosse isso que eu tinha em mente. Eu tinha em mente que o segundo campo era desnecessário, embora eu tenha descoberto que o segundo campo às vezes é necessário. No exemplo aqui, o segundo campo não é necessário (porque um setter padrão sem corpo faria isso), mas o respondente o estava colocando em (corpo do setter e segundo campo), para explicar ao questionador qual era sua linha sem o o segundo campo estava fazendo.
barlop
33

Essa é uma propriedade automática e é a notação abreviada para isso:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}
Teoman Soygul
fonte
4
... exceto que o campo de apoio não está acessível.
Vlad
7
... é por isso que é chamado de campo de apoio .
Teoman Soygul
5
No entanto, você deve ser capaz de ver isso <Type>k__BackingFieldcom reflexão.
Vlad
25

Em C # 6:

Agora é possível declarar as propriedades automáticas apenas como um campo:

public string FirstName { get; set; } = "Ropert";

Propriedades automáticas somente leitura

public string FirstName { get;} = "Ropert";
M.Hassan
fonte
13
public string Type { get; set; } 

Não é diferente de fazer

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}
Cão de Segurança
fonte
5

É uma propriedade com suporte automático, basicamente equivalente a

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}
Jamiec
fonte
4

Elas são chamadas de propriedades automáticas.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Funcionalmente (e em termos do IL compilado), eles são iguais às propriedades com campos de apoio.

Jeff
fonte
1
Você ainda pode fazer referência ao _type ou tipo privado dentro da classe, ou apenas usar Type?
mikey
2
Não, MAS você pode especificar o modificador para a propriedade auto: public string Type {get; conjunto privado; }
Jeff de
Você não conseguiria acessar _type neste caso.
Security Hound de
1
Então, nesse caso, this.Type = "foo"; deve estar OK, mas de fora da instância.Tipo = "foo"; não vai .. Esses adereços automáticos são definitivamente uma adição útil à linguagem. Obrigado.
mikey de
1

Eu sei que esta é uma questão antiga, mas com o lançamento do C # 6, agora você pode fazer algo assim para propriedades privadas.

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }
Anônimo
fonte
2
você pode definir o valor inicial diretamente em C # 6: public string myProp {get; } = "algum valor") sem construtor;
M.Hassan
1

Você também pode usar uma expressão lambda

public string Type
{
    get => _type;
    set => _type = value;
}
Ahmad Aghazadeh
fonte