Что такое {получить; задавать; } синтаксис в C #? - PullRequest
523 голосов
/ 23 февраля 2011

Я изучаю ASP.NET MVC и могу читать документы на английском языке, но я не совсем понимаю, что происходит в этом коде:

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

Что это значит: { get; set; }?

Ответы [ 16 ]

524 голосов
/ 23 февраля 2011

Это так называемое свойство auto, которое по сути является сокращением для следующего (подобный код будет сгенерирован компилятором):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}
402 голосов
/ 03 апреля 2015

Итак, насколько я понимаю, { get; set; } - это "автоматическое свойство", которое, как сказали @Klaus и @Brandon, является сокращением для написания свойства с "вспомогательным полем".Так что в этом случае:

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

Однако, если вы похожи на меня - примерно час назад - вы не понимаете, что такое свойства и методы доступа есть, и у вас нет лучшего понимания некоторых основных терминов.MSDN - отличный инструмент для изучения подобных вещей, но его не всегда легко понять новичкам.Поэтому я попытаюсь объяснить это более подробно здесь.

get и set являются аксессорами , что означает, что они могут получить доступданные и информация в частных полях (обычно из вспомогательного поля ) и, как правило, из public properties (как вы можете видеть в приведенном выше примере).

Нет никаких сомнений в том, что приведенное выше утверждение довольно запутанно, поэтому давайте рассмотрим несколько примеров.Допустим, этот код относится к жанрам музыки.Так что в классе Жанр мы будем хотеть разные жанры музыки.Допустим, мы хотим иметь 3 жанра: хип-хоп, рок и кантри.Чтобы сделать это, мы будем использовать имя Class для создания новых экземпляров этого класса.

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)

Теперь, когда мы создали экземплярыКласс жанра, мы можем установить названия жанров, используя свойство 'Name' , которое было установлено выше.

public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 

Мы можем установить имя 'g1в хип-хоп, написав следующее

g1.Name = "Hip Hop";

То, что здесь происходит, довольно сложно.Как я уже говорил, get и set получают доступ к информации из личных полей, к которой вы не смогли бы получить доступ.get может только читать информацию из этого частного поля и возвращать ее.set может только записать информацию в это личное поле.Но имея свойство с get и set, мы можем выполнять обе эти функции.И, записывая g1.Name = "Hip Hop";, мы специально используем функцию set из нашего свойства Name

set использует неявную переменную с именем value.По сути, это означает, что каждый раз, когда вы видите «значение» в set, оно ссылается на переменную;переменная «значение».Когда мы пишем g1.Name =, мы используем = для передачи переменной value, которая в данном случае равна "Hip Hop".По сути, вы можете думать об этом так:

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

Важно отметить, что приведенный выше пример на самом деле не написан в коде.Это скорее гипотетический код, который представляет то, что происходит в фоновом режиме.

Итак, теперь мы установили Имя экземпляра g1 Жанр , яповерьте, мы можем получить имя, написав

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"

, и если мы запустим это, мы получим "Hip Hop" в нашей консоли.

Так что для целей этогопояснение Я дополню пример также выводами

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

Вывод:

"Genres: Hip Hop, Rock, Country"
96 голосов
/ 23 февраля 2011

Это автоматические свойства

По сути, это еще один способ написания свойства с использованием вспомогательного поля.

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}
36 голосов
/ 23 февраля 2011

Это короткий способ сделать это:

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}
29 голосов
/ 23 февраля 2011

Это быстрый способ выставить элементы данных как общедоступные, так что вам не нужно явно создавать частные элементы данных. C # создаст для вас личный элемент данных.

Вы можете просто сделать ваши элементы данных общедоступными, не используя этот ярлык, но затем, если вы решите изменить реализацию элемента данных, чтобы иметь некоторую логику, вам придется сломать интерфейс. Короче говоря, это ярлык для создания более гибкого кода.

15 голосов
/ 12 сентября 2015

По сути, это ярлык:

class Genre{
    private string genre;
    public string 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
10 голосов
/ 23 февраля 2011

Это автоматически реализованное свойство для C #.

6 голосов
/ 23 февраля 2011

Это автоматически реализованное свойство. Это в основном сокращенный способ создания свойств для класса в C # без необходимости определения для них частных переменных. Они обычно используются, когда при получении или установке значения переменной не требуется никакой дополнительной логики.

Подробнее о MSDN можно прочитать в Руководство по программированию автоматически внедряемых свойств .

6 голосов
/ 23 февраля 2011

Они являются инициаторами имени публичной собственности.

Вы могли бы использовать их для получения / установки значения этого свойства в экземпляре Genre.

5 голосов
/ 15 июня 2017
  • Шаблон get / set предоставляет структуру, которая позволяет добавлять логику во время установки ('set') или извлечения ('get') экземпляра свойства экземпляра класса, который может бытьполезно, когда для свойства требуется некоторая логика реализации.

  • Свойство может иметь только метод доступа get, что делается для того, чтобы сделать это свойство доступным только для чтения

  • При реализации шаблона get / set в качестве контейнера используется промежуточная переменная, в которую можно поместить значение и извлечь его.Промежуточная переменная обычно начинается с подчеркивания.эта промежуточная переменная является закрытой, чтобы обеспечить доступ к ней только через вызовы get / set.См. Ответ Брэндона, поскольку его ответ демонстрирует наиболее часто используемые синтаксические соглашения для реализации get / set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...