Нужны некоторые разъяснения о поведении ссылочного типа - PullRequest
0 голосов
/ 09 декабря 2018

Я прочитал разницу между типом значения и типом ссылки , в этой статье автор говорит:

Поскольку ссылочные типы представляют адрес переменнойвместо самих данных, присвоение ссылочной переменной другой не копирует данные .Вместо этого он создает вторую копию ссылки, которая ссылается на то же местоположение кучи, что и исходное значение

На основе приведенной выше цитаты я ожидал следующий код, который будет назначать ссылочную переменнуюдругой, не копирует данные, но действительно копирует и данные.Не могли бы вы помочь мне понять это?

Class1 i1 = new Class1();
i1.Name = "Name1";
Class1 i2 = i1;
//i2.Name is "Name1"

Для i2 Я ожидал, что это относится к тому же расположению кучи, что и правильное значение i1, но на основании данных статьине должен быть скопирован.Кроме того, мой вопрос не заслуживает того, чтобы его помечали как дубликат, потому что я знаю о разнице между значением и ссылочным типом, мне просто нужно кое-что прояснить по ссылочным типам и каково использование глубокого копирования / клона / мелкого, если мы можем просто использовать присвоение?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Для i2, как я ожидал, это относится к тому же расположению кучи, что и правильное значение i1

Правильно, они относятся к одному и тому же расположению в памяти.

, но на основании статьи данные копировать не следует.

Снова исправьте, данные не скопированы, давайте разберемся в иллюстрации:

             _ _ _ _
            |       |
 i1  - - - -| addr  |
            |_ _ _ _|

Теперь, когда вы делаете Class1 i2 = i1;, вы по существу копируете ссылку на i1 и присваиваете ей i2, которую вы можете визуализировать как:

             _ _ _ _
            |       |
 i1  - - - -| addr  |
            |_ _ _ _|
          /
         /               
        /     
   i2  /

, следовательно, i1.Name и i2.Name имеютодно и то же имя, потому что и i1, и i2 относятся к одному и тому же объекту в памяти.

0 голосов
/ 09 декабря 2018

Ссылка - это просто указатель на объект.Это просто копирует ссылку.Если вы сделаете i2.Name = "foobar"; i1.Name также изменится на foobar.

...