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

标签 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 个对象,但有 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()

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

关于c# - 更新一个对象会以某种方式更新另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289881/

相关文章:

c# - C#获取登录用户名

c# - JavaScriptSerializer 无效的 JSON 原语

active-directory - Microsoft AD GUID 不匹配

c# - 什么是好的唯一 PC 标识符?

c# - 使用 ALL 的 LINQ 查询

c# - 如何使用 retry-after header 使用 asp.net http 客户端轮询 API

debugging - 有没有办法将 GUID 与随机数区分开来?

javascript - 可以在 Javascript 中生成加密强度高的 UUID 吗?

.net - DLL (.Net) 中的 GUID

c# - 在两个 c# 程序集之间共享代码