C# 复制对象而不保留引用

C# 复制对象而不保留引用,c#,windows-phone-8.1,C#,Windows Phone 8.1,背景:我有一个直接链接到WPF中UI的对象列表。我需要对这些对象进行一些处理,但是当我异步处理它们时,我不希望对UI性能和美学原因进行任何刷新 所以我想,我可以使用Collection.CopyToT[]数组,int index复制这些项,然后用复制的项覆盖我的原始列表。问题是,即使这样,引用仍会保留,UI也会不断刷新。 我所做的代码示例: MyUIObject[] myCopiedList = new MyUIObject[MyObjectsLinkedToTheUI.Count];

背景:我有一个直接链接到WPF中UI的对象列表。我需要对这些对象进行一些处理,但是当我异步处理它们时,我不希望对UI性能和美学原因进行任何刷新

所以我想,我可以使用Collection.CopyToT[]数组,int index复制这些项,然后用复制的项覆盖我的原始列表。问题是,即使这样,引用仍会保留,UI也会不断刷新。 我所做的代码示例:

    MyUIObject[] myCopiedList = new MyUIObject[MyObjectsLinkedToTheUI.Count];
    MyObjectsLinkedToTheUI.CopyTo(myCopiedList);
    foreach (MyUIObject myCopiedItem in myCopiedList)
    {
        //while I do this, the UI is still updated
        PerformLongAndWearyOperationAsync(myCopiedItem);
    }
    MyObjectsLinkedToTheUI.Clear();
    foreach (var myCopiedItem in myCopiedList)
    {
        MyObjectsLinkedToTheUI.Add(myCopiedItem);
    }
是否有可能复制我的项目而不保留对原始对象的引用

更新1


感谢您迄今为止的贡献。有一件事我忘了提:这是针对Windows Phone 8.1的,因此iClonable不可用。

您需要以某种方式克隆它们。或者实现接口并手动执行所有重写,或者您可以使用一些技巧,比如序列化和反序列化对象

具有序列化的流如下所示:

拿着你的东西 将其序列化为例如JSON、二进制格式等。 现在将步骤2中得到的反序列化到新对象中 这样就可以得到对象的一个副本,但它需要更多的处理能力,并且容易出现一些难以捕捉的错误。但这是一个简单的方法。实现iClonable更可靠,但您需要自己编写所有映射


也可以考虑使用结构而不是类。始终按值而不是引用复制。它有一些缺点,所以它们是否适合您的使用场景取决于您

你需要以某种方式克隆它们。或者实现接口并手动执行所有重写,或者您可以使用一些技巧,比如序列化和反序列化对象

具有序列化的流如下所示:

拿着你的东西 将其序列化为例如JSON、二进制格式等。 现在将步骤2中得到的反序列化到新对象中 这样就可以得到对象的一个副本,但它需要更多的处理能力,并且容易出现一些难以捕捉的错误。但这是一个简单的方法。实现iClonable更可靠,但您需要自己编写所有映射


也可以考虑使用结构而不是类。始终按值而不是引用复制。它有一些缺点,所以它们是否适合您的使用场景取决于您

您需要克隆它们-创建新对象并复制属性,如果需要深度复制,还需要克隆任何引用类型。搜索clone shallow copy和deep copy,您会找到满足您需要的内容。您需要克隆它们-创建新对象并复制属性,如果需要深度复制,还可以克隆任何引用类型。搜索克隆浅拷贝和深拷贝,你会找到满足你需要的东西。你也可以使用一个工具,比如在实现iClonable时,它可以删除一些样板拷贝。@CodingGorilla当然,这是一种可能的方法,可以帮助程序员加快速度,但基本思想是一样的——要么以某种明确的方式进行,要么采取一些技巧。或者如果符合要求,就使用structs。这并不能真正让我满意,但如果没有其他方法。。。非常感谢。我决定采用手动映射的方式。你也可以使用一种工具,比如在实现ICloneable时,它可以删除一些样板文件复制。@CodingGorilla当然,这是一种可能的方法,可以帮助程序员加快速度,但基本思想是一样的——要么以某种方式显式地完成,要么进行一些技巧/技巧。或者如果符合要求,就使用structs。这并不能真正让我满意,但如果没有其他方法。。。非常感谢。我决定采用手工绘制地图的方式。