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

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

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

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

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

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

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

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

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

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

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

Нельзя отрицать, что приведенное выше утверждение довольно запутанно, поэтому переходим к некоторым примерам. Скажем, этот код относится к жанрам музыки. Поэтому в классе Genre мы захотим разного жанра музыки. Скажем, мы хотим иметь 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, мы можем установить имена жанров с помощью свойства "Имя" , которое было установлено выше.

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' в Hip Hop, написав следующий

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{return 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"
277
ответ дан Josie Thompson 03 апр. '15 в 0:42
источник поделиться

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

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

public class Genre
{
    private string _name;

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

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

public class Genre
{
  private string _name;

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

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

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

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

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

Подробнее о MSDN Руководство по программированию с автоматическим внедрением.

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

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

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

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

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

Genre oG = new Genre();
oG.Name = "Test";
3
ответ дан David Brunelle 23 февр. '11 в 23:51
источник поделиться

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

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

2
ответ дан linquize 28 февр. '13 в 8:39
источник поделиться
  • Шаблон get/set предоставляет структуру, которая позволяет добавлять логику во время настройки ('set') или retrieve ('get') экземпляра свойства экземплярированного класса, что может быть полезно, когда некоторые для свойства требуется эталонная логика.

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

public string Log {get; задавать; }

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

Пример:

закрытый строковый журнал;

public string Log {   получить   {   return this.log;   }   задавать   {   this.log = значение;   } }

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

-2
ответ дан 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
источник поделиться

Другие вопросы по меткам