С #: геттер / сеттер

109

Я где-то видел что-то вроде следующего, и мне стало интересно, что это значит. Я знаю, что они являются геттерами и сеттерами, но хочу знать, почему тип строки определяется таким образом. Спасибо за помощь.

public string Type { get; set; }
майя
источник
4
Это называется автоматическим свойством, взгляните на это: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov
Это определение названного свойства "Type", тип .NET которого System.string. Больше ничего нет.
Джон
2
Я думаю, что он может путать название Auto-Property с классом Reflection System.Type. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Ответы:

178

Это автоматически реализуемые свойства (для краткости автоматические свойства).

Компилятор автоматически сгенерирует эквивалент следующей простой реализации:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}
Джастин Нисснер
источник
2
@barlop, как кто-то из Google, без понятия, что нужно обновить? М. Хасанс отвечает, что вы имеете в виду? Спасибо.
Aethenosity
1
@Aethenosity в ретроспективе Я думаю, что это нормально .. Я думал в терминах примеров геттер-сеттера. У запрашивающего есть действительный случай установщика геттера, который является гораздо более лаконичным (как один лайнер / второе поле не требуется). Вы также можете писать public int b { get { return b * 2; } } не нужно второе поле. Но я думаю, что когда у вас есть сеттер с телом, вам понадобится второе поле. На этом изображен сеттер с телом. Хотя делает то же самое, что и строчка спрашивающего.
barlop 07
2
@Aethenosity есть также С # 7, в котором вам все еще нужно второе поле, если у сеттера есть тело, но у него есть =>синтаксис и нет ключевого слова return. Хотя я имел в виду не это. Я имел в виду, что второе поле не нужно, хотя с тех пор я обнаружил, что второе поле необходимо иногда. В приведенном здесь примере второе поле не обязательно (потому что это сделает установщик по умолчанию без тела), но ответчик вставлял его (тело установщика и второе поле), чтобы объяснить спрашивающему, что это за строка без второе поле занималось.
barlop 07
33

Это автоматическое свойство, и это сокращенное обозначение:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}
Теоман Сойгуль
источник
4
... за исключением того, что резервное поле недоступно.
Влад
7
... поэтому его называют резервным полем .
Teoman Soygul
5
Тем не менее, вы должны увидеть это как <Type>k__BackingFieldотражение.
Влад
25

В C # 6:

Теперь можно объявить автоматические свойства как поле:

public string FirstName { get; set; } = "Ropert";

Авто-свойства только для чтения

public string FirstName { get;} = "Ropert";
М. Хассан
источник
13
public string Type { get; set; } 

Ничем не отличается от того,

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}
Собака безопасности
источник
5

Это автоматически поддерживаемое свойство, в основном эквивалентное

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}
Jamiec
источник
4

Это так называемые автоматические свойства.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Функционально (и с точки зрения скомпилированного IL) они такие же, как свойства с резервными полями.

Джефф
источник
1
Можете ли вы по-прежнему ссылаться на частный _type или type в классе, или вы просто используете Type?
Майки
2
Нет, НО вы можете указать модификатор для свойства auto: public string Type {get; частный набор; }
Джефф
В этом случае вы не сможете получить доступ к _type.
Security Hound
1
Итак, в этом случае this.Type = "foo"; должно быть в порядке, но извне instance.Type = "foo"; не будет .. Эти авто реквизиты определенно являются полезным дополнением к языку. Спасибо.
mikey
1

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

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }
Анонимный
источник
2
вы можете установить начальное значение непосредственно в C # 6: public string myProp {get; } = "какое-то значение") без конструктора;
M.Hassan
1

Вы также можете использовать лямбда-выражение

public string Type
{
    get => _type;
    set => _type = value;
}
Ахмад Агазаде
источник