Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.131.13.37] |
|
Сообщ.
#1
,
|
|
|
Цитата Добавлено выделение кода. Прошу обратить внимание. kl Есть примерчик: <br>using System; <br>namespace Qwer <br>{ <br>class Simple<br>{ <br>public int f; <br>} <br>class Test<br>{ <br>public static void Main() <br>{ <br>int i = 123; <br>object o = i; <br>object o1 = o; <br>o1 = 345; <br>Console.WriteLine("o = {0}, o1 = {1}", o, o1); <br><br>Simple a = new Simple(); <br>a.f = 1; <br>Sample b = a; <br>a.f = 2; <br>Console.WriteLine("a.f = {0}, b.f = {1}", a.f, b.f); <br>Console.ReadLine(); <br>} <br>} <br>} <br> нА экране получаем: o = 123, o1 = 345 a.f = 2, b.f = 2 - ПОЧЕМУ ??? ---------------------------------------- При присваивании i к о создается объект в куче, который и содержит значение 123 Когда мы присвоили о1 = о - мы скопировали адрес ссылки и теперь о1 указывает на тот же объект, что и о о1 = 345 - 345 неявно приводится к оbject, то есть в куче создается объект, который содержит значение 345, значит о1 будет указывать на ДРУГОЙ объект в куче когда мы b=a, соответственно b тоже указывает на тот же объект в куче, что и а когда мы a.f = 2 - так как f - имеет тип int и присваивается ему тоже тип целый, то нового объекта в куче не создается и соответственно объекты a, b продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . . ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ? И есть ли вариант, что рассуждая таким образом я получу неверные результаты? |
Сообщ.
#2
,
|
|
|
Прав. int - это алиас для System.Integer - value-type. При присваивании object'у типа-значения всегда неявно происходит упаковка (boxing - конструкция __box() в MC++). Это в первом случае.
Во втором случае - как ты описал. Просто банальное копирование значения P.S. Если рассуждаешь правильно, а результаты не те - это баг. ;D |
Сообщ.
#3
,
|
|
|
Не без чужой помощи уже, наверное, окончательно разобрался с данной ситуацией.
Не важно какой тип имеет переменная f, главное, что при присваиваниии меняется только поле внутри объекта. . . Можно переменной f сделать любой тип - будет работать . . . |