С# 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 и более поздних версиях.
Ответ 3
Ответ в IL. Используйте ildasm и сравните.
http://msdn.microsoft.com/en-us/library/f7dy01k1%28v=VS.90%29.aspx
Ответ 4
В конечном итоге в этом случае он работает с одним и тем же. Разница возникает, когда вы хотите применить какие-либо правила к get/setting, и в этом случае вам нужно использовать переменную private/protected и скрыть ее за общедоступным свойством.
Ответ 5
Нет. Фактически, когда вы используете более короткую версию (public string Name { get; set; }
), компилятор автоматически создает частное поле для этого свойства.