На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Опять ссылочные типы . . .Box/unbox
    Цитата
    Добавлено выделение кода. Прошу обратить внимание. kl


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

    ExpandedWrap disabled
      <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 -
      Прав. int - это алиас для System.Integer - value-type. При присваивании object'у типа-значения всегда неявно происходит упаковка (boxing - конструкция __box() в  MC++). Это в первом случае.
      Во втором случае - как ты описал. Просто банальное копирование значения

      P.S. Если рассуждаешь правильно, а результаты не те - это баг.  ;D
         Не без чужой помощи ;) уже, наверное, окончательно разобрался с данной ситуацией.
         Не важно какой тип имеет переменная f, главное, что при присваиваниии меняется только поле внутри объекта. . .
         Можно переменной f сделать любой тип - будет работать . . .
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,1075 ]   [ 17 queries used ]   [ Generated: 25.04.24, 05:47 GMT ]