Что такое {get; задавать; } в С#?

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

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

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

467
задан kn3l 23 февр. '11 в 23:49
источник поделиться
17 ответов

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

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}
466
ответ дан Klaus Byskov Pedersen 23 февр. '11 в 23:53
источник поделиться

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

Нельзя отрицать, что приведенное выше утверждение довольно запутанно, поэтому давайте рассмотрим несколько примеров. Допустим, этот код относится к жанрам музыки. Так что в классе Жанр мы будем хотеть разные жанры музыки. Допустим, мы хотим иметь 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 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 there but I do know it 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 из нашего свойства 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"
370
ответ дан Josie Thompson 03 апр. '15 в 0:42
источник поделиться

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

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

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}
92
ответ дан Brandon 23 февр. '11 в 23:51
источник поделиться

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

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}
35
ответ дан froeschli 23 февр. '11 в 23:54
источник поделиться

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

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

24
ответ дан Kelsey 23 февр. '11 в 23:55
источник поделиться

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

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
ответ дан Jirson Tavera 12 сент. '15 в 4:07
источник поделиться

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

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

5
ответ дан Dusda 23 февр. '11 в 23:52
источник поделиться

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

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

5
ответ дан TimCodes.NET 23 февр. '11 в 23:51
источник поделиться

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

Genre oG = new Genre();
oG.Name = "Test";
4
ответ дан David Brunelle 23 февр. '11 в 23:51
источник поделиться
  • Шаблон get/set предоставляет структуру, которая позволяет добавлять логику во время настройки ('set') или retrieve ('get') экземпляра свойства экземплярированного класса, что может быть полезно, когда некоторые для свойства требуется эталонная логика.

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

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

4
ответ дан Chris Halcrow 15 июня '17 в 4:22
источник поделиться

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

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

3
ответ дан linquize 28 февр. '13 в 8:39
источник поделиться

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

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

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

введите описание изображения здесь

2
ответ дан Omid Ebrahimi 29 авг. '16 в 14:09
источник поделиться

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

1
ответ дан Ashraf Abusada 26 нояб. '14 в 0:34
источник поделиться

Функция Get вызывается, когда свойство отображается справа (RHS). Набор вызывается, когда свойство отображается слева (LHS) символа '='.

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

Пример:

public string Log { get; set; }

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

Пример:

private string log;

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

Кроме того, стоит отметить, что "получатель" и "установщик" могут использовать разные "вспомогательные поля"

0
ответ дан Bala 25 мая '17 в 0:47
источник поделиться

Если вы хотите установить свойство, используйте этот код:

public string Name
{
   get
   {
        if (validacao)
           return "Name Last Name";
        else
           return "Name";
   }
}
-7
ответ дан Marcelo Lima Braga 12 февр. '15 в 20:13
источник поделиться

Другие вопросы по меткам или Задайте вопрос