【问题标题】:Copying objects without keeping a reference复制对象而不保留引用
【发布时间】:2016-03-30 14:24:03
【问题描述】:

背景:我有一个直接链接到 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 不可用。

【问题讨论】:

  • 您需要“克隆”它们 - 创建新对象并复制属性,如果您想要“深拷贝”,还可以克隆任何引用类型。搜索“克隆”“浅拷贝”和“深拷贝”,您会找到满足您需求的内容。

标签: c# windows-phone-8.1


【解决方案1】:

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

带有序列化的流程是这样的:

  1. 拿走你的东西
  2. 将其序列化为例如 JSON、二进制格式等。
  3. 现在将您在第 2 步中获得的内容反序列化为新对象

通过这种方式,您将获得对象的副本,但它需要更多的处理能力,并且容易出现一些难以捕捉的错误。但这是一个简单的方法。实现ICloneable 的东西更可靠,但您需要自己编写所有映射。

另外,考虑使用结构而不是类。 Structs 总是按值复制而不是引用。它有一些缺点,因此取决于您是否适合您的使用场景。

【讨论】:

  • 在实现ICloneable时也可以使用Automapper之类的工具,它可以省去一些样板复制。
  • @CodingGorilla 当然,这是一种可能的方法,可以帮助程序员加快速度,但基本想法是相同的 - 要么以某种方式明确,要么采用一些黑客/技巧。如果满足要求,或者使用结构。
  • 确实不能满足我,但如果没有别的办法...谢谢。我决定采用手动映射方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2016-05-17
  • 2010-10-09
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多