C# 性能,使用Observable collection还是INotifyPropertyChange更好?
我必须用c语言编写一些程序,并且为了在程序之间执行IO,我必须使用C# 性能,使用Observable collection还是INotifyPropertyChange更好?,c#,performance,c#-4.0,C#,Performance,C# 4.0,我必须用c语言编写一些程序,并且为了在程序之间执行IO,我必须使用INotifyPropertyChange(在列表上)或observeCollection 我想知道哪个更适合在c#程序之间执行IO操作 感谢阅读INotifyPropertyChanged用于在有界属性值或集合发生更改时通知UI。然而,ObservableCollection用于在绑定集合被修改时通知UI(例如从集合中添加或删除对象),如果其中一个集合对象中的属性值发生更改,则它无法通知UI。请注意,它同时继承INotifyCo
INotifyPropertyChange
(在列表上)或observeCollection
我想知道哪个更适合在c#程序之间执行IO操作
感谢阅读INotifyPropertyChanged用于在有界属性值或集合发生更改时通知UI。然而,ObservableCollection用于在绑定集合被修改时通知UI(例如从集合中添加或删除对象),如果其中一个集合对象中的属性值发生更改,则它无法通知UI。请注意,它同时继承INotifyCollectionChanged和INotifyPropertyChanged
[SerializableAttribute]
public class ObservableCollection<T> : Collection<T>,
INotifyCollectionChanged, INotifyPropertyChanged
[SerializableAttribute]
公共类ObservableCollection:Collection,
INotifyCollectionChanged,INotifyPropertyChanged
请参阅上面链接中的文档:
在许多情况下,您使用的数据是对象的集合。例如,数据绑定中的常见场景是使用ItemsControl(如ListBox、ListView或TreeView)来显示记录集合。
可以枚举实现IEnumerable接口的任何集合。但是,要设置动态绑定以便集合中的插入或删除自动更新UI,集合必须实现INotifyCollectionChanged接口。此接口公开CollectionChanged事件,该事件应在基础集合更改时引发
WPF提供了ObservableCollection类,它是实现INotifyCollectionChanged接口的数据采集的内置实现。
在实现您自己的集合之前,请考虑使用<强> ExtababelCopys<强>或现有的集合类中的一个,如列表、集合和BIDENGLIST等。如果你有一个高级的场景并且想要实现你自己的集合,考虑使用ILIST,ILIST提供一个非通用的对象集合,这些对象可以由索引单独访问。实现IList可以为数据绑定引擎提供最佳性能
根据您在问题和评论中列出的标准,您最好进行一次可观察的收集
INotifyPropertyChanged接口的存在只是告诉您-属性已更改。当您谈论列表时,属性将是Count和Item[]之类的内容。这意味着,实际上,所有你实际上被告知的是“列表的内容已经改变了”,而不是关于这一改变实际是什么的任何细节。如果没有任何此类信息,控件真正能做的就是完全基于集合的当前状态重新绘制自身
然而,使用ObservableCollection,您会被告知何时添加了一个项目(以及该项目是什么以及在哪里添加的),何时删除了一个项目(以及该项目是什么以及它以前在哪里)。这些信息足以让UI控件只需重新绘制实际更改的内容,这比重新绘制整个内容要高效得多。这就是为什么发明了可观测收集——使用它 这两种选择做的事情不一样。您正在这两个选项中进行选择:
实现INotifyPropertyChanged
的列表属性,每次修改列表时都会抛出事件
observetecollection
ListBox
),则必须重新绘制整个元素,因为它必须假设整个列表已更改(即:它可能不再是相同的列表!)
使用选项2,您将引发有关在列表中添加或删除的单个项目的特定事件。如果有一个UI元素绑定到此列表,则它只能通过修改与这些元素相关的UI来响应
考虑这样一个示例:从列表中删除一个项目,并且列表绑定到一个WPFListBox
控件。使用选项1,将重新创建列表的全部内容。使用选项2,删除的项的控件被删除,但列表的其余部分保持不变
从本例中可以清楚地看到,ObservableCollection
——因为它支持特定于您正在做的事情的事件——在许多情况下效率更高。这就是说,除非您的集合中有大量数据或非常复杂的UI,否则性能提升将是微不足道的。此外,如果您正在对列表进行大量修改,您可能会发现刷新整个列表的速度更快
归根结底,在StackOverflow上,如果不重复以下咒语,就无法准确回答任何性能问题:分析代码,并根据结果做出决定。为什么不使用最适合您设计的代码编写一些代码呢?现在想想这类事情,你并没有把注意力集中在手头的问题上。好吧,两者都有相同的设计——一个字符串列表或一个可观察的字符串集合,我的问题不是关于设计,而是performance@user2417992那么做一个基准:)我想,但我不能,我正在为一个程序制作某种插件,我需要列表的内容,例如字符串,我试着看看插件是否工作,但我不知道第二个程序的来源。@user2417992你不需要插件来做基准测试。只需创建一个小程序,对两个senarios进行压力测试,然后比较它们。我可以在列表上使用notifyPropertychange,它们实际上做的是相同的事情。如果你愿意,有一个不同的