Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET: Общие вопросы > Опять ссылочные типы . . .Box/unbox


Автор: vad 27.05.03, 14:04
Цитата
Добавлено выделение кода. Прошу обратить внимание. kl


Есть примерчик:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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 продолжают указывать на один и тот же объект в куче и поэтому на экране получаем такие результаты. . .
 ПРАВ ЛИ Я В СВОИХ РАССУЖДЕНИЯХ ?
И есть ли вариант, что рассуждая таким образом я получу неверные результаты?

Автор: kl 27.05.03, 15:09
Прав. int - это алиас для System.Integer - value-type. При присваивании object'у типа-значения всегда неявно происходит упаковка (boxing - конструкция __box() в  MC++). Это в первом случае.
Во втором случае - как ты описал. Просто банальное копирование значения

P.S. Если рассуждаешь правильно, а результаты не те - это баг.  ;D

Автор: vad 29.05.03, 05:38
 Не без чужой помощи ;) уже, наверное, окончательно разобрался с данной ситуацией.
 Не важно какой тип имеет переменная f, главное, что при присваиваниии меняется только поле внутри объекта. . .
 Можно переменной f сделать любой тип - будет работать . . .

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)