Переменная класса типа, параметр, поле, возвращаемое значение, или другие подобные места хранения следует рассматривать как проведение «идентификатор объекта». Если какой-либо объект Foo
имеет свойство типа Bar
некоторого типа класса, которое поддерживается полем _Bar
, а _Bar
содержит «идентификатор объекта № 24601», то оператор Foo.Bar.Text = "George"
будет вызывать setter Text
на объекте # 24601 со значением «George» , Обратите внимание, что этот оператор не будет изменять объект Foo
(его поле _Bar
проведет «идентификатор объекта # 24601» до выполнения оператора и будет по-прежнему удерживать его после); это, скорее всего, повлияет на объект # 24601.
Хранилище структурного типа должно рассматриваться как содержащее содержимое всех его полей (как государственных, так и частных).Если Foo.Boz
были свойством типа Rectangle
(который является структурой) и фонового поля _Boz
, то доступ к Foo.Boz
создаст новый временный экземпляр типа Rectangle
, все поля которого будут скопированы из полей Foo._Boz
. Попытка прочитать Foo.Boz.X
скопировала бы все поля _Boz
во временный экземпляр, а затем поле доступа X
этого экземпляра.
Обратите внимание, что некоторые действительно старые и злые компиляторы C# интерпретируют код Foo.Boz.X = 5;
как Rectangle temp; temp.X = 5;
, отбрасывая полученное значение темпа, но не выдавая никакого предупреждения. Такое поведение компилятора побудило некоторых людей объявить, что структуры должны быть «неизменными», чтобы гарантировать, что такой код будет генерировать ошибку компилятора, а не создавать фиктивное поведение. К сожалению, эта вера сохраняется и по сей день, несмотря на то, что любой достойный компилятор запретил бы такой код, даже если X
был изменчивым полем.
Обратите внимание, что правильный идиоматических способ обновить свойство изменяемого типа структуры является:
Rectangle temp = MyListOFRectangles[5];
temp.X = 5;
MyListOFRectangles[5] = temp;
Если Rectangle
известно иметь общественное целое поле с именем X
и MyListOfRectangles
является List<Rectangle>
, один Безразлично» t знать о любом из других свойств, конструкторов и т. д. Rectangle
, чтобы знать, что вышеуказанный код изменит MyListOfRectangles[5].X
, но не повлияет на какое-либо другое имущество MyListOfRectangles[5]
, а также на любую собственность MyListOfRectangles[4]
. Хороший, ясный и легкий. Структуры раскрытого поля допускают частичное редактирование значений способом, который является ясным и последовательным, в отличие от любого другого типа данных.
_Мы знаем, что новое имя Hook будет применено к базовому значению person1_ Ну, если тип `Person` является ** классом **, то геттер вернет ** ссылку ** в` Объект ** ** **. Затем этот объект будет мутирован. Частное поле `person1` является другой ссылкой на тот же объект. Но если «Лицо» было ** структурой **, то получатель возвращал ** значение **, которое было бы ** копией ** значения `person1`. Поэтому даже ваш первый код не будет работать, если `Person` был значением типа. – 2012-11-19 14:26:08