复制对象而不保留引用
Copying objects without keeping a reference
背景:我有一个直接链接到 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 不可用。
您需要以某种方式克隆它们。实现 ICloneable 接口并手动重写所有内容,或者您可以使用一些 hacks/tricks 序列化和反序列化对象。
序列化流程是这样的:
- 拿走你的对象
- 将其序列化为JSON、二进制格式等
- 现在将您在第 2 步中获得的内容反序列化为新对象
您将以这种方式获得对象的副本,但它需要更多的处理能力并且容易出现一些难以发现的错误。但这是一个简单的方法。实现 ICloneable
的东西更可靠,但你需要自己编写所有映射。
此外,考虑使用结构而不是 类。 Structs 总是按值而非引用复制。它有一些缺点,所以它们是否适合您的使用场景取决于您。
背景:我有一个直接链接到 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 不可用。
您需要以某种方式克隆它们。实现 ICloneable 接口并手动重写所有内容,或者您可以使用一些 hacks/tricks 序列化和反序列化对象。
序列化流程是这样的:
- 拿走你的对象
- 将其序列化为JSON、二进制格式等
- 现在将您在第 2 步中获得的内容反序列化为新对象
您将以这种方式获得对象的副本,但它需要更多的处理能力并且容易出现一些难以发现的错误。但这是一个简单的方法。实现 ICloneable
的东西更可靠,但你需要自己编写所有映射。
此外,考虑使用结构而不是 类。 Structs 总是按值而非引用复制。它有一些缺点,所以它们是否适合您的使用场景取决于您。