С# getters, декларация сеттеров

Возможные дубликаты:
Зачем использовать геттеры и сеттеры?
Авто-Свойства С# 3.0 - полезно или нет?

Существует ли разница между определяющими свойствами следующим образом:

// private, with getter & setter
private string fName;
public string Name
{
    get { return this.fName }
    set { this.fName = value }
}

// define as a Property
public string Name { get; set;}

Насколько я могу судить, это похоже только на стилистическое предпочтение. Я что-то пропустил?

Ответ 1

Отличия:

  • Вторая форма будет компилироваться только с помощью компилятора С# 3 или более поздней версии
  • Вторая форма не позволяет любому коду (даже в том же классе) напрямую обращаться к полю, поскольку реальное поле имеет "невыразимое имя"

Вторая версия - это то, что известно как автоматически реализованное свойство (или "автоматическое свойство" для краткости). Они были введены в С# 3. Если вы только пишете код, который выглядит как первая версия, то есть нет никакой логики, тогда автоматические свойства великолепны. Вы всегда можете добавить логику позже, переведя ее в первую форму. Весь ваш код будет совместим с этим изменением как в исходных, так и в двоичных условиях совместимости.

Помните, что автоматические свойства не позволяют указывать значения по умолчанию, и нет такой вещи, как подлинно автоматическое свойство readonly (т.е. одно без геттера). Ближайшим вы можете стать публичный получатель с частным сеттером, например.

public string Name { get; private set; }

Это не совсем то же самое, но это достаточно близко во многих ситуациях.

Ответ 2

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

Ответ 4

В конечном итоге в этом случае он работает с одним и тем же. Разница возникает, когда вы хотите применить какие-либо правила к get/setting, и в этом случае вам нужно использовать переменную private/protected и скрыть ее за общедоступным свойством.

Ответ 5

Нет. Фактически, когда вы используете более короткую версию (public string Name { get; set; }), компилятор автоматически создает частное поле для этого свойства.