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

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

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

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

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

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

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}
470
ответ дан 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"
373
ответ дан 03 апр. '15 в 0:42
источник

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

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

public class Genre
{
    private string _name;

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

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

public class Genre
{
    private string _name;

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

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

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

25
ответ дан 23 февр. '11 в 23:55
источник

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

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
15
ответ дан 12 сент. '15 в 4:07
источник
9
ответ дан 23 февр. '11 в 23:50
источник

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

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

6
ответ дан 23 февр. '11 в 23:51
источник

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

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

6
ответ дан 23 февр. '11 в 23:52
источник

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

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

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

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

5
ответ дан 15 июня '17 в 4:22
источник

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

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

4
ответ дан 28 февр. '13 в 8:39
источник

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

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

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

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

3
ответ дан 29 авг. '16 в 14:09
источник

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

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

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

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

Пример:

public string Log { get; set; }

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

Пример:

private string log;

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

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

1
ответ дан 25 мая '17 в 0:47
источник

Это в основном сокращение. Вы можете написать общедоступную строку Name {get; set; задавать; } like in many examples, but you can also write it: } как во многих примерах, но вы также можете написать это:

private string _name;

public string Name
{
    get { return _name;}
    set { _name = value ;} // value is a special keyword here
}

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

Позволь мне привести пример:

private class Person {
    private int _age;  // Person._age = 25; will through an error
    public int Age{
        get { return _age;}  // example: Console.WriteLine(Person.Age);
        set { 
            if ( age >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}

Официально он называется "Автоматически реализованные свойства" и имеет хорошую привычку читать (руководство по программированию). Я также рекомендовал бы обучающее видео С# Properties: зачем использовать "get" и "set".

-1
ответ дан 12 дек. '18 в 17:30
источник

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

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

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