2016-10-27 2 views
1

У меня есть два объекта, но когда я его обновляю, другой элемент с тем же идентификатором GUID также обновляется, хотя я пытаюсь применить новый GUID, чтобы я мог их разделить.Обновление одного объекта Обновления Другое как-то

var completedSecond = model.CompletedTransfers.First(); 
var transferedTransfers = model.TransferedTransfers.First(); 

if (transferedTransfers.Count != 0) { 
    transferedTransfers.RowId = Guid.NewGuid(); 
} 

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

+5

У вас нет 2 объектов, но 2 ссылки на один и тот же объект в памяти –

+0

можно ли их разделить? – Monzingo

+0

или воссоздать один объект в другом с другим GUID? – Monzingo

ответ

5

У вас нет 2 объектов, кроме 2 ссылок на один и тот же объект в памяти. В классах C# ссылочные типы означают, что ваш completedSecond ссылается на объект в памяти, который в этом случае совпадает с объектом, на который ссылается объект transferedTransfers.

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

  1. Реализуя ICloneable interface

    public class MyClass : ICloneable 
    { 
        public Guid Id { get; set; } 
    
        public object Clone() 
        { 
         return new MyClass { Id = Id }; 
        } 
    } 
    
  2. Другой способ иметь copy constructor:

    public class MyClass 
    { 
        public Guid Id { get; set; } 
    
        public MyClass() { } 
    
        public MyClass(MyClass other) 
        { 
         Id = other.Id; 
        } 
    } 
    

Прочтите это для различий между двумя способами: Copy constructor versus Clone()

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

+0

Итак, как выглядит фактическое создание экземпляра, поскольку вы создаете что-то из чего-то другого (клон)? – Monzingo

1

Это происходит потому, что model.TransferedTransfers объект передается по ссылке, а не по значению. переменная completeSecond и TransferTransfers обе указывают на модель .CompletedTransfers. Также помните об именах запахов (transferedTranfers)

Смежные вопросы