c# - NotifyCollectionChangedAction : object instance on removal?

标签 c# collections inotifycollectionchanged

我目前正在为一个集合实现 INotifyCollectionChanged 接口(interface),该集合通常具有非常关键和短暂的项目。所有这些项目都实现了 IDispose,可以在从集合中移除之前立即调用它。我无法控制销毁命令,我只能顺其自然。

我现在的麻烦是,如何传播“删除”操作。 NotifyCollectionChangedAction 构造函数确实提供了仅包含指定操作的变体,但我确实有已删除项目的索引。遗憾的是,没有仅采用索引的重载。

所以我想我可以:

  • 只传递“移除” Action
  • 传递删除操作以及“空”对象和索引
  • 将删除操作与已处置的对象和索引一起传递

你更喜欢哪一个?我有点害怕错误地实现这样一个“核心”接口(interface)并可能导致不明显相关的错误......

我找不到任何关于“更改”列表中的项目会发生什么的指南,是否有可用的指南?

旁注:如果这很重要,该集合将不会立即绑定(bind)到 WPF。

最佳答案

据我在 MSDN 中看到的,删除 唯一合适的数据集是 overload taking the instance , 和 overload taking instance and index .您可以尝试后者只传递索引;它可能 工作...但考虑到第一个过载的存在,我不抱希望。如果您给它对象,下游代码可能无法知道更改了哪个项目。所以我认为你将不得不传递对象。这通常不会引起问题,因为大多数代码只是将它用于引用检查;对象仍然在那里(它还没有被收集)——它刚刚被处理掉,这里使用了“just”……主观上(因为这可能仍然导致问题)。

当然,另一种选择是将对象包装在外观中。那么实际对象是否被释放、设置为 null 和/或被垃圾收集都无关紧要;外观仍然存在(但应该对其进行编码以处理不可用的对象)。

作为最终选择;你必须使用他们的收藏吗?您能否包装该集合,以便选择何时告诉它这些事情?那么您将保留对生命周期的完全控制...

关于c# - NotifyCollectionChangedAction : object instance on removal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3740817/

相关文章:

c# - 作为 WCF 数据契约的 ObservableCollection 和 CollectionChanged 事件

c# - 以可等待的方式等待 INotifyTaskCompletion 属性的结果?

c# - 从列表集合中删除项目不删除

c# Task.WhenAll 在等待完成时阻塞

java - 在没有类主体的情况下扩展集合

collections - 如何使用 Magento 中的集合获取产品类别信息

.net - 为什么 .NET Framework 中没有 ObservableKeyedCollection<TKey, TValue>?

c# - 用 Show() 替换 ShowDialog()

c# - 在 Azure IoTEdge 的模块中启动长时间运行的方法的最佳方式是什么?