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


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";



5

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

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.