我必须在c#中制作一些程序,为了在我必须使用的程序之间执行IO,或者使用INotifyPropertyChange
(在List<>
上(或ObservableCollection<>
的属性。
我想知道哪一个更好地在c#程序之间执行IO操作。
感谢您阅读
基于您在问题中列出的标准&评论,你最好有一个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。
这两个选项的作用不同。您在这两个选项之间进行选择:
- 实现
INotifyPropertyChanged
的列表属性,每次修改列表时都抛出事件 ObservableCollection
型的一个性质
对于选项1,当您修改列表时,会引发一个事件,表明"整个列表已更改"。如果您有一个UI元素绑定到此列表(例如ListBox
(,则必须重新绘制整个元素,因为它必须假设整个列表已被更改(即:它可能不再是同一个列表!(。
使用选项2,您将引发有关在列表中添加或删除的单个项目的特定事件。如果您有一个绑定到此列表的UI元素,它只能通过修改与这些元素相关的UI来做出响应。
考虑以下示例:从列表中删除一个项,并且该列表绑定到WPF ListBox
控件。使用选项1,将重新创建列表的整个内容。对于选项2,删除的项目的控件将被删除,但列表的其余部分保持不变。
从这个例子中可以清楚地看到,ObservableCollection
-因为它支持特定于您正在做的事情的事件-在许多情况下会更高效。也就是说,除非您的集合中有大量数据或非常复杂的UI,否则性能提升将微不足道。此外,如果你对列表进行了大量修改,你可能会发现刷新整个列表会更快。
最终,在StackOverflow上,如果不重复以下咒语,就无法准确回答任何性能问题:评测您的代码,并根据结果做出决定