性能,使用Observable集合还是INotifyPropertyChange更好

本文关键字:INotifyPropertyChange 更好 集合 使用 Observable 性能 | 更新日期: 2023-09-27 18:16:07

我必须在c#中制作一些程序,为了在我必须使用的程序之间执行IO,或者使用INotifyPropertyChange(在List<>上(或ObservableCollection<>的属性。

我想知道哪一个更好地在c#程序之间执行IO操作。

感谢您阅读

性能,使用Observable集合还是INotifyPropertyChange更好

基于您在问题中列出的标准&评论,你最好有一个ObservableCollection。

INotifyPropertyChanged接口的存在只是为了告诉您-一个属性已更改。当您谈论列表时,属性将是Count和Item[]。这意味着,实际上,你被告知的只是"列表的内容发生了变化",但没有任何关于实际变化的细节。如果没有任何这样的信息,控件所能做的就是完全根据集合的当前状态重新绘制自己。

然而,使用ObservableCollection,您会被告知何时添加项目(该项目是什么以及添加到哪里(,何时删除项目(该项是什么以及过去在哪里(。这对于UI控件来说足够了,只需重新绘制实际更改的内容,这比重新绘制整个内容要高效得多。这就是ObservableCollection被发明的原因——使用它吧!

请注意,ObservableCollection同时继承了INotifyCollectionChanged和INotifyPropertyChanged。

[SerializableAttribute]
public class ObservableCollection<T> : Collection<T>, 
    INotifyCollectionChanged, INotifyPropertyChanged

请参阅上面链接中的文档:

在许多情况下,使用的数据是对象的集合。例如,数据绑定中的常见场景是使用ItemsControl(如ListBox、ListView或TreeView(来显示记录集合。您可以枚举任何实现IEnumerable接口的集合。但是,要设置动态绑定,以便在集合中插入或删除操作自动更新UI,集合必须实现INotifyCollectionChanged接口。此接口公开CollectionChanged事件,该事件应在基础集合发生更改时引发。

WPF提供ObservableCollection类,它是实现INotifyCollectionChanged接口的数据集合的内置实现。在实现自己的集合之前,请考虑使用ObservableCollection或现有的集合类之一,如List、collection和BindingList等。如果您有一个高级场景,并且想要实现自己的集合,请考虑使用IList,它提供了一个可以由索引单独访问的非通用对象集合。实现IList可以为数据绑定引擎提供最佳性能。

INotifyPropertyChanged用于在有界属性值或集合更改时通知UI。而ObservableCollection用于在绑定集合被修改时通知UI(例如从集合中添加或删除对象(如果其中一个集合对象中的属性值发生更改,则无法通知UI。

这两个选项的作用不同。您在这两个选项之间进行选择:

  1. 实现INotifyPropertyChanged的列表属性,每次修改列表时都抛出事件
  2. ObservableCollection型的一个性质

对于选项1,当您修改列表时,会引发一个事件,表明"整个列表已更改"。如果您有一个UI元素绑定到此列表(例如ListBox(,则必须重新绘制整个元素,因为它必须假设整个列表已被更改(即:它可能不再是同一个列表!(。

使用选项2,您将引发有关在列表中添加或删除的单个项目的特定事件。如果您有一个绑定到此列表的UI元素,它只能通过修改与这些元素相关的UI来做出响应。

考虑以下示例:从列表中删除一个项,并且该列表绑定到WPF ListBox控件。使用选项1,将重新创建列表的整个内容。对于选项2,删除的项目的控件将被删除,但列表的其余部分保持不变。

从这个例子中可以清楚地看到,ObservableCollection-因为它支持特定于您正在做的事情的事件-在许多情况下会更高效。也就是说,除非您的集合中有大量数据或非常复杂的UI,否则性能提升将微不足道。此外,如果你对列表进行了大量修改,你可能会发现刷新整个列表会更快。

最终,在StackOverflow上,如果不重复以下咒语,就无法准确回答任何性能问题:评测您的代码,并根据结果做出决定