更新一个对象会以某种方式更新另一个对象
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 个不同的对象,您需要实例化一个新对象
通过实施 ICloneable
interface
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()
此外,在谈到对象的复制时,您有所谓的深复制和浅复制。您可以在这里找到更多关于这些的信息:
- Shallow copy or Deep copy?
- Object.MemberwiseClone Method
发生这种情况是因为 model.TransferedTransfers 对象是按引用传递的,而不是按值传递的。变量 completedSecond 和 transferedTransfers 都指向 model.CompletedTransfers。还要注意命名气味 (transferedTransfers)
我有两个对象,但是当我更新一个对象时,具有相同 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 个不同的对象,您需要实例化一个新对象
通过实施
ICloneable
interfacepublic 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()
此外,在谈到对象的复制时,您有所谓的深复制和浅复制。您可以在这里找到更多关于这些的信息:
- Shallow copy or Deep copy?
- Object.MemberwiseClone Method
发生这种情况是因为 model.TransferedTransfers 对象是按引用传递的,而不是按值传递的。变量 completedSecond 和 transferedTransfers 都指向 model.CompletedTransfers。还要注意命名气味 (transferedTransfers)