更新一个对象以某种方式更新其他对象

时间:2016-10-27 16:31:37

标签: c# guid

我有两个对象,但是当我更新一个时,即使我尝试应用新的GUID以便我可以将它们分开,也会更新具有相同GUID的另一个项目。

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

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

当我运行此代码时,这两个项具有相同的GUID,但是当我更新第二个具有新GUID时,第一个对象也获得该新GUID。这怎么可能?

2 个答案:

答案 0 :(得分: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;
        }
    }
    
  3. 请阅读以下两种方式之间的差异:Copy constructor versus Clone()

    此外,在谈论对象的复制时,你会得到所谓的深拷贝和浅拷贝。有关这些的更多信息,请访问:

答案 1 :(得分:1)

这是因为model.TransferedTransfers对象是通过引用传递的,而不是通过值传递的。变量completedSecond和transfered将两个点转移到model.CompletedTransfers。还要注意命名气味(transferedTranfers)

相关问题