2010-11-27 3 views
2
class MyClas 
{ 
    public System.Windows.Point p; 
    public void f() 
    { 
     p.X = 0; 
    } 
} 

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

Разница между свойствами и переменными

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

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


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

ответ

7

Вы используете mutable struct which is evil.

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

Обходным путем является использование p=new Point(x,y)

+0

+1: для копии структуры – TalentTuner 2010-11-27 15:22:53

Смежные вопросы