Разница между свойствами и переменными - PullRequest
2 голосов
/ 27 ноября 2010
class MyClas
{
   public System.Windows.Point p;
   public void f()
   {
      p.X = 0;
   }
}

Этот код работает отлично.

В то же время этот код вызывает ошибку компиляции («Невозможно изменить возвращаемое значение p, поскольку оно не является переменной»):

class MyClas
{
   public System.Windows.Point p {get; set;}
   public void f()
   {
      p.X = 0;
   }
}


Какая разница?

1 Ответ

7 голосов
/ 27 ноября 2010

Вы используете изменяемую структуру , которая является злой .

Ваша проблема в том, что свойство возвращает копию структуры, а не ссылку на исходное поле.Таким образом, ваши изменения будут влиять только на скопированную структуру.В некоторых простых случаях (вызов сеттеров) компилятор ловит вашу ошибку.В сложных случаях (вызов метода, который изменяет структуру) компилятор не перехватывает его, и ваш код молча терпит неудачу (то есть копия модифицируется, а оригинал остается неизменным).1007 *

...