3

Не совсем понял разницу между

public object Variable1 {get; set; } 

и

public object Variable1
{
    get { return this.Variable1; }  
    set {this.Variable1 = value; }   
}

В обоих случаях это свойство. Отличается ли не обработанные геттер и сеттер от обработанных таким образом?

eastwing
  • 1,287
Leonid
  • 127
  • 2
    Так нет разницы, это и есть реализация по умолчанию. Во второй форме вы можете изменить логику. – vp_arth Feb 15 '17 at 14:01
  • Возможный дубликат вопроса: Для чего нужны свойства? – Grundy Feb 15 '17 at 14:06
  • 1
    во втором случае должна быть бесконечная рекурсия – Grundy Feb 15 '17 at 14:06
  • Называть свойства Variable1 - нехорошо. По спецификации C# - переменные (variable) - это fields, array elements, local variables, and parameters. Свойства, события, классы, аттрибуты и прочее - это не переменные. –  Feb 15 '17 at 15:15
  • Хорошо. Учту на будущее. – Leonid Feb 15 '17 at 15:30

1 Answers1

6

В том виде, который привели вы, разница в том, что первый пример кода корректный, а второй - нет :) У вас во втором случае чтение свойства возвращает это же свойство, что приводит к возврату этого же свойства - и так до бесконечности. Как заметили в комментариях, это бесконечная рекурсия. Вероятно, вы имели в виду вот это:

private object field1;
public object Variable1
{
    get { return field1; }  
    set { field1 = value; }   
}

Вот в этом случае разницы нет, public object Variable1 {get; set; } - это автоматически реализуемое свойство, по смыслу - абсолютно тоже самое.

eastwing
  • 1,287
  • 1
    только var1 закрыть бы желательно, нет? – vp_arth Feb 15 '17 at 14:34
  • @vp_arth ага, поправил – eastwing Feb 15 '17 at 14:35
  • Извиняюсь, но не совсем понял. Раньше писал так и не совсем понял почему рекурсия. Разве геттер не возвращает само свойство? – Leonid Feb 15 '17 at 14:37
  • 1
    @Leonid геттер - это метод, который выполняется при попытке прочитать значение свойства. То есть, в итоге нужно получить какое-то значение, а у вас возвращается ссылка на свойство, провоцируя выполнение геттера. Который возвращает ссылку на свойство, провоцируя выполнение геттера – eastwing Feb 15 '17 at 14:39
  • Логику понял, но почему тогда работает? O_o – Leonid Feb 15 '17 at 14:41
  • 1
    @Leonid Не совсем понял, что именно работает. В приведённом вами виде оно в принципе не может работать - у вас не указан тип свойства. А если указать, то не работает - я даже проверил :) – eastwing Feb 15 '17 at 14:47
  • Понял. Огромное спасибо за разъяснение! – Leonid Feb 15 '17 at 14:52
  • @eastwing var1 - это поле, а не переменная. не стоит назвать поле var[iable]1 :) –  Feb 15 '17 at 15:08
  • @PashaPash Да мне не жалко, я переименую - но почему вдруг поле не является переменной? – eastwing Feb 15 '17 at 15:10
  • хотя var1 - в любом случае неудачное название, дошло :) – eastwing Feb 15 '17 at 15:12
  • @eastwing по спеке - поле является. но по ней же, например, переменными являются и параметры. спасибо, так лучше –  Feb 15 '17 at 15:14