2016-01-14 5 views
2

Ниже приведена моя копия супруга клиенту (оба являются одним и тем же типом объекта). Супруг имеет значение null.Почему этот объект не null после мелкой копии?

client = spouse; // Copying data 
spouse = null; 

Затем я приостанавливаю (используя точку останова на другой строке) и проверяю память клиента и супруга. супруг имеет значение null, однако клиент не является.

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

Cheers

+1

Это не мелкая копия. Если «клиент» и «супруг» являются ссылочными типами (т. Е. Если они являются экземпляром класса), вы меняете * указатели *, а не копируете данные. И даже если бы он * сделал мелкую копию, можно было бы ожидать, что «клиент» не будет пустым, так как это копия исходного супруга – Rob

+0

. Чтобы добавить к этому, единственный раз, когда эта функция будет выполняться в «Normal C#», будет для параметров 'ref'. – Rob

+0

Правильно, они являются ссылочными типами. Спасибо, Роб. Я бы отметил это как ответ, но его комментарий. – Robert

ответ

3

Это не происходит, потому что вы меняете значение указателей, а не самого объекта.

Давайте представим себе такой сценарий:

var spouse = new Person(); //Let's say the memory address of this new person is 0x000010 

Теперь мы имеем это:

Person client = null; //The pointer of client now points to 0x000000 

client = spouse;  //The pointer of client now points to 0x000010 

spouse = null;  //The pointer of spouse now points to 0x000000 
         //However - client has *not* changed, it still points to 0x000010 
         //and the object still remains in memory. 
13

Ваш супруг живет по адресу: Улица Сезам Улица 123.

Запишите на листе бумаги: SPOUSE: 123 Улица Сезам.

Теперь вы записываете на другой лист бумаги: КЛИЕНТ :. Затем вы копируете все, что говорится после SPOUSE на первом листе бумаги.

Теперь у вас есть два листа бумаги. Один говорит «SPOUSE: 123 Улица Сезам». Другой говорит: «КЛИЕНТ: 123 Улица Сезам».

Теперь вы удаляете адрес на странице с сообщением SPOUSE.

Что теперь говорит о том, что говорит CLIENT?


Ваше замешательство очевидно при выборе жаргона.

Не говорите, что «делает мелкую копию». Скажем, «копирует ссылку», потому что это то, что вы делаете. «Мелкий» относителен, не говоря о том, что. Скажите, что на самом деле происходит: значение копируется и значение является ссылкой.

Не говорите, что «этот объект имеет значение null». Это как сказать «автомобиль на моей подъездной дорожке, которого нет»; это бессмысленно. A переменная может содержит нулевую ссылку. A ссылка может быть нулевой ссылкой; это ссылка, которая ссылается на какой-либо объект. Но это не объект; это отсутствие объекта.

Когда вы делаете свой язык точным, эти разногласия начинают быстро падать.

-3

, как вы используете для мелкой копии не надлежащим образом в C#. C# предоставляет нам функцию, которую мы можем использовать для выполнения мелкой копии. функция MemberwiseClone().

Попробуйте

Client = Spouse.MemberwiseClone(); 

Пожалуйста, скажите мне, если он не работает для вас. cheers

+0

вы также можете ссылаться на https://msdn.microsoft.com/en-us/library/system.object.memberwiseclone(v=vs.110).aspx –

+0

'MemberwiseClone' - защищенный метод, это будет работать, только если написанный внутри класса, который «Супруг» является экземпляром. – Rob