Связывание свойств в C # и неожиданные результаты

2

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

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

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

Теги:
struct
properties
value-type

2 ответа

5
Лучший ответ

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

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

Foo.vector.x = 123;

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

Foo.vector.x = 123;

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

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

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

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

Foo.Vector = new Vector(x, Foo.Vector.y);
  • 0
    Я до сих пор не вижу ситуации, когда Vector v = Foo.Vector; vx = 123; не будет делать то, что я ожидаю (исключая проблемы параллелизма и реализации свойств daft)
  • 2
    @Kragen, предполагается, что Vector является типом значения и поэтому копируется по значению , а не по ссылочному типу, копируемому по ссылке . Вот почему у типов значений есть имя, которое они имеют. Локальная переменная v является копией Foo.Vector; мутируя это меняет только v.
Показать ещё 1 комментарий
2

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню