Связывание свойств в C # и неожиданные результаты - PullRequest
2 голосов
/ 25 января 2010

Я только что быстро прочитал эту статью (в частности, немного о том, почему он решил использовать структуры / поля вместо классов / свойств) и увидел эту строку:

Результат свойства не является истинным l-значением, поэтому мы не можем сделать что-то вроде Vertex.Normal.dx = 0. Цепочка свойств дает очень неожиданные результаты.

О каких неожиданных результатах он говорит?

Ответы [ 2 ]

5 голосов
/ 25 января 2010

Я бы добавил к ответу Дбемерлина, что ключом здесь является примечание Рико о том, что свойства не являются "lvalues" или, как мы их называем в C #, "переменными".

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

Foo.vector.x = 123;

тогда у нас есть переменная типа value - поле Foo.vector - и поэтому мы можем изменить его свойство x. Но если у вас есть свойство типа значения:

Foo.Vector.x = 123;

свойство не является переменной. Это эквивалентно

Vector v = Foo.Vector;
v.x = 123;

, который изменяет временную переменную v, а не место хранения, поддерживающее свойство.

Вся проблема исчезнет, ​​если вы откажетесь от изменяемых типов значений. Чтобы изменить x, создайте новый вектор с новыми значениями и замените все это:

Foo.Vector = new Vector(x, Foo.Vector.y);
2 голосов
/ 25 января 2010

Единственным «неожиданным» результатом будет то, что назначение не будет длиться долго, потому что Vertex.Normal возвращает копию, а код назначает от 0 до dx копии.

Я не могу проверить это сейчас, но это то, что я ожидал (из того, что я знаю. Обработка структур в .NET)

...