Co to jest składnia {get; set;} W C#?

Uczę się ASP.NET MVC, a ja umiem czytać angielskie dokumenty, ale nie bardzo rozumiem co się dzieje z tym kodem:

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

Co to znaczy: { get; set; }?

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

15 answers

Jest to tak zwana właściwość auto i zasadniczo jest skrótem dla następującego kodu (podobny kod zostanie wygenerowany przez kompilator):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}
 447
Author: Klaus Byskov Pedersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 20:53:12

Więc jak rozumiem to { get; set; } jest "auto właściwość", która tak jak @Klaus i @Brandon powiedział jest skrótem do pisania właściwości z "backing field."Więc w tym przypadku:

public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}

Jeśli jednak jesteś taki jak ja - około godziny temu - nie rozumiesz, co właściwości oraz accessors są, a Ty też nie masz najlepszego zrozumienia niektórych podstawowych terminologii. MSDN to świetne narzędzie do nauki takich rzeczy, ale to nie zawsze łatwe do zrozumienia dla początkujących. Więc postaram się wyjaśnić to bardziej dogłębnie tutaj.

get i setaccessors, oznacza to, że są w stanie uzyskać dostęp do danych i informacji w polach prywatnych (zwykle z pola zaplecza ) i zwykle robią to z publicznych właściwości (Jak widać w powyższym przykładzie).

Nie da się zaprzeczyć, że powyższe stwierdzenie jest dość mylące, więc przejdźmy do kilka przykładów. Powiedzmy, że ten kod odnosi się do gatunków muzycznych. Więc w ramach gatunku klasowego, będziemy chcieli różnych gatunków muzyki. Powiedzmy, że chcemy mieć 3 gatunki: Hip Hop, Rock i Country. W tym celu użyjemy nazwy klasy , aby utworzyć nowe instancje tej klasy.

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)

Teraz, gdy stworzyliśmy instancje klasy Genre możemy ustawić nazwy gatunków używając 'Name' nieruchomość to było ustawione w górę powyżej.

public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 
Możemy ustawić nazwę " G1 " na Hip Hop, pisząc następujący tekst]}
g1.Name = "Hip Hop";
To, co się tu dzieje, jest złożone. Jak mówiłem wcześniej, get i set uzyskują dostęp do informacji z prywatnych pól, do których w przeciwnym razie nie bylibyście w stanie uzyskać dostępu. get może tylko odczytać informacje z tego prywatnego pola i zwrócić je. set może tylko zapisać informacje w tym prywatnym polu. Ale posiadając nieruchomość z get i {[10] }jesteśmy w stanie wykonać oba tych funkcji. I pisząc g1.Name = "Hip Hop"; w szczególności używamy funkcji set z naszej właściwości Name

set używa zmiennej implicit o nazwie value. Zasadniczo oznacza to, że za każdym razem, gdy widzisz "wartość" w set, odnosi się to do zmiennej; zmiennej "wartość". Kiedy piszemy g1.Name = używamy = aby przekazać zmienną value, która w tym przypadku jest "Hip Hop". Można więc zasadniczo myśleć o tym w ten sposób:

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"'
    }
}

Ważne jest, aby pamiętać, że powyższy przykład nie jest tak naprawdę napisany w kodzie. To bardziej hipotetyczny kod, który reprezentuje to, co dzieje się w tle.

Skoro mamy ustawione nazwę instancji G1 gatunku {32]}, wierzę, że możemy uzyskać nazwę pisząc

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"
Jeśli to uruchomimy, dostaniemy się do naszej konsoli.

Więc na potrzeby tego wyjaśnienia uzupełnię przykład o wyjścia jako well

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);
    }
}

Wyjście:

"Genres: Hip Hop, Rock, Country"
 349
Author: Josie Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 00:30:12

Są to właściwości automatyczne

Zasadniczo inny sposób zapisu właściwości z polem zaplecza.

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}
 92
Author: Brandon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 00:31:06

To jest krótki sposób na zrobienie tego:

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}
 35
Author: froeschli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 00:31:37

Jest to skrót do wystawiania członków danych jako publicznych, dzięki czemu nie trzeba jawnie tworzyć członków danych prywatnych. C# utworzy dla Ciebie prywatnego członka danych.

Możesz po prostu upublicznić swoich członków danych bez używania tego skrótu, ale jeśli zdecydujesz się zmienić implementację członka danych, aby mieć jakąś logikę, musisz złamać interfejs. W skrócie jest to skrót do tworzenia bardziej elastycznego kodu.

 24
Author: Kelsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 20:55:36

W Zasadzie to skrót od:

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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-12 01:07:12
 8
Author: Daniel A. White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 20:50:47

Są to dodatki do nazwy własności publicznej.

Użyjesz ich, aby uzyskać / ustawić wartość tej właściwości w instancji Genre.

 5
Author: TimCodes.NET,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 20:51:13

Jest to automatycznie zaimplementowana właściwość. Jest to w zasadzie skrócony sposób tworzenia właściwości dla klasy w C#, bez konieczności definiowania prywatnych zmiennych dla nich. Są one zwykle używane, gdy nie jest wymagana dodatkowa logika podczas pobierania lub ustawiania wartości zmiennej.

Możesz przeczytać więcej na MSDN Auto-Implemented Properties Programming Guide .

 5
Author: Dusda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 20:52:42

Oznacza to, że jeśli utworzysz zmienną typu Genre, będziesz mógł uzyskać dostęp do zmiennej jako właściwość

Genre oG = new Genre();
oG.Name = "Test";
 4
Author: David Brunelle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 21:02:09
  • Wzorzec get / set zapewnia strukturę, która umożliwia dodawanie logiki podczas ustawiania ('set') lub pobierania ('get') instancji właściwości klasy instancyjnej, co może być przydatne, gdy wymagana jest jakaś logika instancyjna dla właściwości.

  • Właściwość może mieć tylko dostęp do "get", co odbywa się w celu uczynienia tej właściwości tylko do odczytu

  • Podczas implementacji wzorca get/set zmienna pośrednia jest używana jako kontener do które można umieścić i wyodrębnić wartość. Zmienna pośrednia jest zwykle poprzedzona podkreśleniem. ta zmienna pośrednia jest prywatna w celu zapewnienia, że można do niej uzyskać dostęp tylko poprzez wywołania get/set. Zobacz odpowiedź Brandona, ponieważ jego odpowiedź pokazuje najczęściej używane konwencje składni do implementacji get / set.

 4
Author: Chris Halcrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 01:22:31

Taka składnia { get; set; } nazywa się właściwościami automatycznymi, składnia C# 3.0

Musisz użyć Visual C# 2008 / csc v3.5 lub nowszego do kompilacji. Ale możesz skompilować dane wyjściowe tak niskie, jak. NET Framework 2.0(nie wymaga środowiska wykonawczego ani klas do obsługi tej funkcji).

 3
Author: linquize,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-28 05:39:15

W Visual Studio, jeśli zdefiniujesz Właściwość X w klasie i chcesz używać tej klasy tylko jako typu, po zbudowaniu projektu otrzymasz ostrzeżenie o treści "Pole X nigdy nie jest przypisane i zawsze będzie miało swoją domyślną wartość".

Dodając { get; set; } do właściwości X, nie otrzymasz tego ostrzeżenia.

Oprócz Visual Studio 2013 i wyższych wersji, dodając { get; set; } możesz zobaczyć wszystkie odniesienia do tego własność.

Tutaj wpisz opis obrazka

 2
Author: Omid Ebrahimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 11:22:48

Get set to modyfikatory dostępu do właściwości. Pobierz odczytuje pole właściwości. Set ustawia wartość właściwości. Get jest jak dostęp tylko do odczytu. Set jest jak dostęp tylko do zapisu. Aby użyć właściwości jako zapisu do odczytu, należy użyć get I set.

 1
Author: Ashraf Abusada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-25 21:34:52

Get jest wywoływany, gdy właściwość pojawia się po prawej stronie (RHS) Set jest wywoływany, gdy właściwość pojawi się po lewej stronie (LHS) of ' = ' symbol

Dla automatycznie zaimplementowanej właściwości, pole zapasowe działa za sceną i nie jest widoczne.

Przykład:

public string Log { get; set; }

Podczas Gdy dla właściwości nie zaimplementowanej automatycznie pole zapasowe jest z góry widoczne jako prywatna zmienna zasięgu.

Przykład:

private string log;

public string Log
{
    get => log;
    set => log = value;
}

Warto również zauważyć ,że tutaj jest "getter" a "setter" może używać innego "pola podkładu"

 -2
Author: Bala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 00:32:26