Каков синтаксис {get; set;} в C#?

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

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

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

15 ответов


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

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}

так как я понимаю { 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 are аксессоры, что означает, что они могут получить доступ к данным и информации в частная поля (обычно из поддержка поля) и обычно делают это из общественные свойства (как вы можете видеть выше образец.)

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

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)

теперь, когда мы создали экземпляры класса Genre мы можем установить имена жанров, используя '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 функция от нашего свойства имени

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

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

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

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"

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

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

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}

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

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}

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

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


в основном это ярлык:

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


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

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


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

вы можете прочитать больше на Автоматически Реализованные Свойства Руководство По Программированию.


это означает, что если вы создадите переменную типа Genre, вы сможете получить доступ к переменной как свойству

Genre oG = new Genre();
oG.Name = "Test";

  • шаблон get/set предоставляет структуру, которая позволяет добавлять логику во время настройки ("set") или извлечения ("get") экземпляра свойства экземпляра класса, который может быть полезен, когда для свойства требуется некоторая логика создания экземпляра.

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

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


такие { get; set; } синтаксис называется автоматические свойства, C# 3.0 синтаксис

необходимо использовать Visual C# 2008 / csc v3.5 или выше для компиляции. Но вы можете скомпилировать выходные данные, которые нацелены на .NET Framework 2.0 (для поддержки этой функции не требуется среда выполнения или классы).


в Visual Studio, Если вы определяете свойство X в классе и вы хотите использовать этот класс только как тип, после создания проекта вы получите предупреждение о том, что "поле X никогда не назначается и всегда будет иметь значение по умолчанию".

добавить { get; set; } to X собственность, вы не получите это предупреждение.

кроме того, в Visual Studio 2013 и верхних версиях, добавив { get; set; } вы можете видеть все ссылки на это свойство.

enter image description here


Get set-модификаторы доступа к свойству. Get считывает поле свойства. Set задает значение свойства. Как сделать доступ только для чтения. Набор как доступ только для записи. Чтобы использовать свойство как read write, необходимо использовать get и set.


Get вызывается, когда свойство появляется справа (RHS) Set вызывается, когда свойство появляется в левой части (LHS) of ' = ' symbol

Для автоматически реализуемое свойство, резервное поле работает за сценой и не видно.

пример:

public string Log { get; set; }

в то время как для не реализованного автоматически свойства резервное поле является авансом, видимым как частная переменная области.

пример:

private string log;

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

также, стоит отметить, что здесь "геттер" и "сеттер" могут использовать другое "резервное поле"