我必须在 c# 中制作一些程序,并且为了在我必须使用的程序之间执行 IO,或者使用INotifyPropertyChange
(on a List<>
) 或ObservableCollection<>
.
我想知道哪个更适合在 c# 程序之间执行 IO 操作。
感谢您阅读
我必须在 c# 中制作一些程序,并且为了在我必须使用的程序之间执行 IO,或者使用INotifyPropertyChange
(on a List<>
) 或ObservableCollection<>
.
我想知道哪个更适合在 c# 程序之间执行 IO 操作。
感谢您阅读
根据您在问题和评论中列出的标准,您最好使用 ObservableCollection。
INotifyPropertyChanged 接口的存在就是为了告诉您 - 属性已更改。当您谈论列表时,属性将是 Count 和 Item[] 之类的东西。这意味着,实际上,您实际上被告知的只是“列表的内容已更改”,而不是有关该更改实际内容的任何细节。如果没有任何此类信息,您的控件真正能做的就是完全基于集合的当前状态重绘自身。
但是,使用 ObservableCollection,您会被告知何时添加项目(以及该项目是什么以及添加的位置)和删除项目的时间(以及该项目是什么以及它曾经在哪里)。对于您的 UI 控件而言,这些信息已经足够,只需重新绘制实际更改的内容,这比重新绘制整个内容要高效得多。这就是 ObservableCollection 被发明的原因——使用它!
请注意,ObservableCollection 继承了 INotifyCollectionChanged 和 INotifyPropertyChanged。
[SerializableAttribute]
public class ObservableCollection<T> : Collection<T>,
INotifyCollectionChanged, INotifyPropertyChanged
请参阅上面链接中的文档:
在许多情况下,您使用的数据是对象的集合。例如,数据绑定中的一个常见场景是使用 ListBox、ListView 或 TreeView 等 ItemsControl 来显示记录的集合。您可以枚举实现 IEnumerable 接口的任何集合。但是,要设置动态绑定以便集合中的插入或删除自动更新 UI,集合必须实现INotifyCollectionChanged接口。此接口公开CollectionChanged事件,该事件应在基础集合更改时引发。
WPF 提供ObservableCollection 类,它是实现INotifyCollectionChanged接口的数据集合的内置实现。在实现您自己的集合之前,请考虑使用ObservableCollection或现有集合类之一,例如 List、Collection 和 BindingList 等。如果您有一个高级场景并且想要实现自己的集合,请考虑使用 IList,它提供了一个可以通过索引单独访问的非泛型对象集合。实现 IList 可为数据绑定引擎提供最佳性能。
INotifyPropertyChanged用于在有界属性值或集合发生更改时通知 UI。而ObservableCollection用于在修改绑定集合时通知 UI(例如从集合中添加或删除对象)如果集合对象之一中的属性值发生更改,则无法通知 UI。
这两个替代方案不做同样的事情。您正在这两个选项之间进行选择:
INotifyPropertyChanged
,每次修改列表时都会在其中抛出事件ObservableCollection
使用选项 1,当您修改列表时,会引发一个事件,显示“整个列表已更改”。如果您有一个绑定到此列表的 UI 元素(例如 a ListBox
),则必须重新绘制整个元素,因为它必须假定整个列表已更改(即:它可能不再是同一个列表! )。
使用选项 2,您将引发有关列表中添加或删除的单个项目的特定事件。如果您有一个绑定到此列表的 UI 元素,它可以通过仅修改与这些元素相关的 UI 来响应。
考虑从列表中删除项目并且列表绑定到 WPFListBox
控件的示例。使用选项 1,将重新创建列表的全部内容。使用选项 2,已删除项目的控件将被删除,但列表的其余部分保持不变。
从这个例子中应该清楚的是ObservableCollection
——因为它支持特定于你正在做的事情的事件——在许多情况下会更有效。也就是说,除非您在集合中有大量数据或非常复杂的 UI,否则性能提升将是微不足道的。此外,如果您对列表进行大量修改,您可能会发现刷新整个列表会更快。
最终,没有任何性能问题可以在 StackOverflow 上准确回答,而无需重复口头禅:分析您的代码,并根据结果做出决定。