更新一个对象会以某种方式更新另一个对象

Updating One Object Updates the Other somehow

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

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

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

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

您没有 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()

此外,在谈到对象的复制时,您有所谓的深复制和浅复制。您可以在这里找到更多关于这些的信息:

发生这种情况是因为 model.TransferedTransfers 对象是按引用传递的,而不是按值传递的。变量 completedSecond 和 transferedTransfers 都指向 model.CompletedTransfers。还要注意命名气味 (transferedTransfers)