2010-07-31 4 views
3

Я не знаю, правильные технические термины, чтобы описать мой вопрос, поэтому я приведу пример:Expose атрибутов класса с аксессором

private Point _PrivateVect = new Point(); 
    public Point Publicvect 
    { 
     get 
     { 
      return _PrivateVect; 
     } 
     set 
     { 
      _PrivateVect = value; 
     } 
    } 

Проблема заключается в том, что если бы я хотел, чтобы получить доступ к Publicvect.X я получаю ошибка Cannot modify the return value of 'Publicvect' because it is not a variable. Есть ли способ обойти это? Или мне просто нужно делать Publicvect = new Point(NewX, Publicvect.Y); навсегда?

+1

Пожалуйста, покажите код, генерирующий эту ошибку. –

+0

@Bob: если вы считаете, что смелый помог, это не так. Мне нужно увидеть фактическую строку кода и фактическую ошибку. –

ответ

2

Еще одна причина, по которой изменяемые структуры являются злыми. Одним из способов является предоставление размеров для удобства доступа:

public Point PublicX { 
    get {return _PrivateVect.X;} 
    set {_PrivateVect.X = value;} 
} 
public Point PublicY { 
    get {return _PrivateVect.Y;} 
    set {_PrivateVect.Y = value;} 
} 

Но другое, что это; да, вам нужно будет делать new Point(x,y) каждый раз, так как Point - это структура. Когда вы получаете доступ к нему через собственность, вы получаете копию , поэтому, если вы скопируете копию, а затем отбросьте копию, вы просто потеряете изменение.

+0

Интересно, считает ли Microsoft эту ошибку или функцию? Спасибо за информацию. – Ben

1

Проблема заключается в том, что тип точки - это Value Type. Поэтому, когда вы манипулируете Pointvect.X, вы действительно манипулируете временной копией типа значения, что, конечно же, не влияет на исходный экземпляр.

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