在不保留引用的情况下复制对象

时间:2016-03-30 14:24:04

标签: c# windows-phone-8.1

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

所以我想,我可能会复制这些项目(使用Collection<T>.CopyTo(T[] array, 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的,因此ICloneable不可用。

1 个答案:

答案 0 :(得分:4)

你需要以某种方式克隆它们。要么实现ICloneable接口并手动进行所有重写,要么可以使用一些黑客/技巧,如序列化和反序列化对象。

序列化的流程是这样的:

  1. 拿走你的对象
  2. 将其序列化为,例如,JSON,二进制格式等。
  3. 现在将您在步骤2中获得的内容反序列化为新对象
  4. 您可以通过这种方式获得对象的副本,但它需要更高的处理能力,并且很容易发现一些难以捕获的错误。但这是一个简单的方法。实现ICloneable的过程更可靠,但您需要自己编写所有映射。

    另外,考虑使用结构而不是类。 Structs始终按值而不是引用进行复制。它有一些缺点,因此如果它们适合您的使用场景,它可以由您自己决定。