背景:我有一个直接链接到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不可用。
答案 0 :(得分:4)
你需要以某种方式克隆它们。要么实现ICloneable接口并手动进行所有重写,要么可以使用一些黑客/技巧,如序列化和反序列化对象。
序列化的流程是这样的:
您可以通过这种方式获得对象的副本,但它需要更高的处理能力,并且很容易发现一些难以捕获的错误。但这是一个简单的方法。实现ICloneable的过程更可靠,但您需要自己编写所有映射。
另外,考虑使用结构而不是类。 Structs始终按值而不是引用进行复制。它有一些缺点,因此如果它们适合您的使用场景,它可以由您自己决定。