Qual é a sintaxe {get; set;} em C#?

Estou a aprender. ASP.NET MVC, e eu posso ler documentos em inglês, mas eu realmente não entendo o que está acontecendo com este código:

public class Genre
{
    public string Name { get; set; }
}

o que significa isto: { get; set; }?

 446
Author: shA.t, 2011-02-23

15 answers

É uma propriedade auto, e é essencialmente uma abreviatura para o seguinte (código similar será gerado pelo compilador):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}
 447
Author: Klaus Byskov Pedersen, 2011-02-23 20:53:12
Por isso, tanto quanto sei, é uma "propriedade automóvel" que, tal como @Klaus e @Brandon disseram, é abreviatura para escrever uma propriedade com um "campo de apoio"."Então, neste caso:
public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}

No Entanto, se você gosta de mim - cerca de uma hora atrás - você não entende realmente o que propriedades e os acessores de é, e você não tem o melhor compreensão de algumas terminologias básicas de qualquer um. MSDN é uma ótima ferramenta para aprender coisas como esta, mas nem sempre é fácil de entender para principiantes. Vou tentar explicar isto mais em profundidade.

get e set são os acessores de, o que significa que eles são capazes de acessar dados e informações em private campos (geralmente a partir de um campo de apoio) e geralmente o fazem a partir de public propriedades (como você pode ver no exemplo acima).

Não há como negar que a afirmação acima é bastante confusa, por isso vamos. em alguns exemplos. Digamos que este código se refere a gêneros musicais. Então, dentro do gênero de classe, nós vamos querer diferentes gêneros de música. Digamos que queremos ter 3 gêneros: Hip Hop, Rock e Country. Para isso, usaríamos o nome da classe para criar novas instâncias dessa classe.
Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre"
                        //called g1. We'll create as many as we need (3)
Genre g2 = new Genre();
Genre g3 = new Genre();

//Note the () following new Genre. I believe that's essential since we're creating a
//new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why
//it's there but I do know it's essential)
Agora que criamos as instâncias da classe de gênero podemos definir os nomes dos gêneros usando o 'nome'' propriedade foi tudo planeado. acima.
public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 

Podemos definir o nome de 'g1' para Hip Hop escrevendo o seguinte

g1.Name = "Hip Hop";
O que está a acontecer aqui é um pouco complexo. Como eu disse antes, get e set acesso a informação de campos privados que você de outra forma não seria capaz de acessar. get só podeler informação desse campo privado e devolvê-la. set só podeescrever informação nesse campo privado. Mas tendo uma propriedade com ambas as coisas, podemos fazer as duas coisas. dessas funções. E ao escrever g1.Name = "Hip Hop"; estamos a usar especificamente a função set da nossa propriedade de nome

set usa uma variável implícita chamada value. Basicamente, o que isso significa é que quando você vê "valor" dentro de set, ele está se referindo a uma variável; a variável "valor". Quando escrevemos g1.Name = estamos a usar o = para passar na variável value que neste caso é "Hip Hop". Então você pode essencialmente pensar nisso assim:

public class g1 //We've created an instance of the Genre Class called "g1"
{
    private string name;
    public string Name
    {
        get => name;
        set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because 
                              //'value' in 'g1' was set to "Hip Hop" by previously
                              //writing 'g1.Name = "Hip Hop"'
    }
}
É importante notar que o o exemplo acima não está escrito no código. É mais um código hipotético que representa o que se passa no fundo.

Agora que temoso nome da instância g1 do género, creio que podemos obter o nome escrevendo

console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property 
                             //and returns the field 'name' which we just set to
                             //"Hip Hop"
E se fizéssemos isto, ficaríamos na nossa consola. Então, para efeitos desta explicação, Vou completar o exemplo com saídas como bem
using System;
public class Genre
{
    public string Name { get; set; }
}

public class MainClass
{
    public static void Main()
    {
        Genre g1 = new Genre();
        Genre g2 = new Genre();
        Genre g3 = new Genre();

        g1.Name = "Hip Hop";
        g2.Name = "Rock";
        g3.Name = "Country";

        Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name);
    }
}

Resultado:

"Genres: Hip Hop, Rock, Country"
 349
Author: Josie Thompson, 2018-06-30 00:30:12

São propriedades automáticas

Basicamente, outra forma de escrever uma propriedade com um campo de apoio.
public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}
 92
Author: Brandon, 2018-06-30 00:31:06

Esta é a forma curta de fazer isto:

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}
 35
Author: froeschli, 2018-06-30 00:31:37

É um atalho para expor os membros dos dados como públicos para que não seja necessário criar explicitamente um membro de dados privado. C# will cria um membro de dados privado para você.

Você poderia apenas tornar seus membros de dados públicos sem usar este atalho, mas então se você decidiu mudar a implementação do membro de dados para ter alguma lógica, então você teria que quebrar a interface. Resumindo, é um atalho para criar um código mais flexível.

 24
Author: Kelsey, 2011-02-23 20:55:36

Basicamente é um atalho de:

class Genre{
    private string genre;
    public void getGenre() {
        return this.genre;
    }
    public void setGenre(string theGenre) {
        this.genre = theGenre;
    }
}
//In Main method
genre g1 = new Genre();
g1.setGenre("Female");
g1.getGenre(); //Female
 14
Author: Jirson Tavera, 2015-09-12 01:07:12

É uma propriedade auto-implementada para C#.

 8
Author: Daniel A. White, 2011-02-23 20:50:47
Eles são os acessores do nome da propriedade pública.

Você os usaria para obter / definir o valor dessa propriedade em uma instância do gênero.

 5
Author: TimCodes.NET, 2011-02-23 20:51:13
Isso é uma propriedade auto-implementada. É basicamente uma forma abreviada de criar propriedades para uma classe em C#, sem ter que definir variáveis privadas para elas. Eles são normalmente usados quando não é necessária nenhuma lógica extra ao obter ou definir o valor de uma variável.

Pode ler mais sobre o Guia de programação de propriedades auto-implementado do MSDN .

 5
Author: Dusda, 2011-02-23 20:52:42

Isto significa que se criar uma variável de tipo de género, será capaz de aceder à variável como uma propriedade

Genre oG = new Genre();
oG.Name = "Test";
 4
Author: David Brunelle, 2011-02-23 21:02:09
  • O padrão get / set fornece uma estrutura que permite que a lógica seja adicionada durante a configuração ('set') ou recuperação ('get') de uma instância de propriedade de uma classe instanciada, que pode ser útil quando alguma lógica de instanciação é necessária para a propriedade.

  • Uma propriedade só pode ter um acessor 'get', que é feito para que a propriedade só seja lida

  • Ao implementar um padrão get / set, uma variável intermediária é usada como um container em que um valor pode ser colocado e um valor extraído. A variável intermediária é normalmente prefixada com um sublinhado. esta variável intermediária é privada, a fim de garantir que ela só pode ser acessada através de suas chamadas get/set. Veja a resposta de Brandon, como sua resposta demonstra as Convenções de sintaxe mais comumente usadas para implementar get/set.

 4
Author: Chris Halcrow, 2017-06-15 01:22:31

Tal sintaxe { get; set; } chama-se propriedades automáticas, sintaxe C# 3.0

Deve usar o Visual C# 2008 / csc V3.5 ou superior para compilar. Mas você pode compilar a saída que tem como alvo tão baixo quanto o.NET Framework 2.0 (sem tempo de execução ou classes necessárias para suportar este recurso).

 3
Author: linquize, 2013-02-28 05:39:15

No Visual Studio, se definir uma propriedade {[[0]} numa classe e quiser usar esta classe apenas como um tipo, depois de construir o seu projecto, receberá um aviso que diz "O campo X nunca é atribuído, e terá sempre o seu valor por omissão".

Adicionando uma propriedade { get; set; } a X, não receberá este Aviso.

Além do Visual Studio 2013 e versões superiores, adicionando { get; set; } Você é capaz de ver todas as referências a isso propriedade.

enter image description here

 2
Author: Omid Ebrahimi, 2016-08-29 11:22:48

Get set são modificadores de acesso à propriedade. Lê o campo de propriedades. Define o valor da propriedade. Obter é como acesso apenas para leitura. O Set é como um acesso apenas para escrita. Para usar a propriedade como ler escrever tanto get e set deve ser usado.

 1
Author: Ashraf Abusada, 2014-11-25 21:34:52
O Get é invocado quando a propriedade aparece do lado direito (RHS) O conjunto é invocado quando a propriedade aparece do lado esquerdo (LHS) do símbolo " = "

Para uma propriedade auto-implementada, o campo de apoio funciona por trás da cena e não é visível.

Exemplo:

public string Log { get; set; }

Considerando que para uma propriedade não auto-implementada o campo de suporte é Frontal, visível como uma variável privada escopada.

Exemplo:

private string log;

public string Log
{
    get => log;
    set => log = value;
}
Além disso, vale a pena notar aqui é o o 'getter' e o' setter 'podem utilizar os diferentes' campos de Suporte '
 -2
Author: Bala, 2018-06-30 00:32:26