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


109

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

public string Type { get; set; }


4
Це називається Авто-властивість, подивіться на це: msdn.microsoft.com/en-us/library/bb384054.aspx
Аллов

Це визначення властивості з назвою "Type", тип .NET якого є System.string. Більше нічого немає.
Джон

2
Я думаю, що він може плутати назву Auto-властивості з класом 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; } } друге поле не потрібно. Але я думаю, коли у вас є сетер з тілом, тоді вам потрібно друге поле. А цей показує сетера з тілом. Хоча це робить так само, як один лайнер запитувача.
барлоп

2
@Aethenosity також є c # 7, згідно з яким ви все ще потребуєте другого поля, коли у сеттера є тіло, але воно має =>синтаксис і відсутні ключові слова. Хоча це було не те, що я мав на увазі. Я мав на увазі, що друге поле є непотрібним, хоча з тих пір я виявив, що друге поле іноді необхідне. У прикладі тут друге поле не є необхідним ('тому, що сеттер за замовчуванням без тіла не зробив би це), але відповідач вводив його (тіло сеттера і друге поле), щоб пояснити запитувачу, що їх лінія без друге поле робилося.
барлоп

33

Це властивість авто, і це скорочення для цього:

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

4
... за винятком того, що поле резервного копіювання недоступне.
Влад

7
... саме тому його називають опорним полем .
Теоман Сойгул

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

Функціонально (і з точки зору складеного ІЛ) вони збігаються з властивостями із полями резервного копіювання.


1
Ви все ще можете посилатись на приватний _type або тип у класі або просто використовувати Type?
mikey

2
Ні, Але ви можете вказати модифікатор для властивості авто: public string Тип {get; приватний набір; }
Джефф

Ви не зможете отримати доступ до _type у цьому випадку.
Охоронна охорона

1
Тож у такому випадку this.Type = "foo"; має бути ОК, але з зовнішнього інстанції.Type = "foo"; не буде. Ці автоматичні реквізити, безумовно, є корисним доповненням до мови. Дякую.
mikey

1

Я знаю, що це старе питання, але з випуском C # 6 ви можете зробити щось подібне для приватних ресурсів.

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

public string myProp { get; }

2
Ви можете встановити початкове значення безпосередньо в C # 6: public string myProp {get; } = "деяке значення") без конструктора;
М.Хассан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.