我有两个对象,但是当我更新一个时,即使我尝试应用新的GUID以便我可以将它们分开,也会更新具有相同GUID的另一个项目。
var completedSecond = model.CompletedTransfers.First();
var transferedTransfers = model.TransferedTransfers.First();
if (transferedTransfers.Count != 0) {
transferedTransfers.RowId = Guid.NewGuid();
}
当我运行此代码时,这两个项具有相同的GUID,但是当我更新第二个具有新GUID时,第一个对象也获得该新GUID。这怎么可能?
答案 0 :(得分:5)
您没有2个对象,但有2个对内存中同一对象的引用。在C#类中,引用类型意味着您的completedSecond
引用了内存中的对象,在这种情况下,它与引用的对象transferedTransfers
相同。
为了获得2个不同的对象,您需要实例化一个新对象
public class MyClass : ICloneable
{
public Guid Id { get; set; }
public object Clone()
{
return new MyClass { Id = Id };
}
}
另一种方法是拥有copy constructor:
public class MyClass
{
public Guid Id { get; set; }
public MyClass() { }
public MyClass(MyClass other)
{
Id = other.Id;
}
}
请阅读以下两种方式之间的差异:Copy constructor versus Clone()
此外,在谈论对象的复制时,你会得到所谓的深拷贝和浅拷贝。有关这些的更多信息,请访问:
答案 1 :(得分:1)
这是因为model.TransferedTransfers对象是通过引用传递的,而不是通过值传递的。变量completedSecond和transfered将两个点转移到model.CompletedTransfers。还要注意命名气味(transferedTranfers)