Объявление геттеров и сеттеров C #


person kosh    schedule 07.02.2011    source источник
comment
Фактически нет - и этот вопрос задавался много раз раньше.   -  person ChrisF    schedule 07.02.2011
comment
@ChrisF, это определенно обман, но я не думаю, что тот, который у тебя есть, вполне подходящий дубликат   -  person Daniel DiPaolo    schedule 07.02.2011
comment
@Daniel - это был первый, который я нашел, и, поскольку система допускает несколько возможных дубликатов, это не проблема.   -  person ChrisF    schedule 07.02.2011


Ответы (5)


Отличия:

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

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

Имейте в виду, что в версиях до C # 6 автоматические свойства не позволяют указывать значения по умолчанию, и не существует такой вещи, как подлинно автоматическое свойство только для чтения (то есть без геттера). Самое близкое, что вы можете найти, - это публичный получатель с частным сеттером, например

public string Name { get; private set; }

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

person Jon Skeet    schedule 07.02.2011
comment
Или авто-собственность по короче;) - person R. Martinho Fernandes; 07.02.2011

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

person George Johnston    schedule 07.02.2011

Ответ в Ил. Используйте ildasm и сравните.

http://msdn.microsoft.com/en-us/library/f7dy01k1%28v=VS.90%29.aspx

person Kris Krause    schedule 07.02.2011

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

person Kendrick    schedule 07.02.2011

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

person Alexander Vakrilov    schedule 07.02.2011