性能,使用Observablecollection和INotifyPropertyChanged会更好吗?

时间:2013-05-31 07:52:00

标签: c# performance c#-4.0

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

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

感谢您阅读

4 个答案:

答案 0 :(得分:7)

根据您在问题中列出的标准&amp;评论,你最好使用ObservableCollection。

INotifyPropertyChanged接口存在告诉您 - 属性已更改。当您谈论列表时,属性将是Count和Item []。这意味着,实际上,您实际被告知的所有内容都是“列表中的内容已经发生变化”,而不是实际上该变更的任何细节。没有任何此类信息,您的所有控件都可以根据集合的当前状态完全重绘自己。

然而,使用ObservableCollection,您会被告知何时添加了一个项目(以及该项目是什么以及添加的位置)以及项目何时被移除(以及该项目是什么以及过去的位置)。这足以让您的UI控件只需重绘实际更改的内容,这比重绘整个内容更有效。这就是ObservableCollection被发明的原因 - 使用它!

答案 1 :(得分:4)

请注意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可以使用数据绑定引擎提供最佳性能。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这两种选择不会做同样的事情。您正在选择以下两个选项:

  1. 实现INotifyPropertyChanged的列表属性,每次修改列表时都会抛出该事件
  2. 类型为ObservableCollection
  3. 的属性

    使用选项1,当您修改列表时,会引发一个“整个列表已更改”的事件。如果您有一个绑定到此列表的UI元素(例如,ListBox),则必须重新绘制整个元素,因为它必须假设整个列表已更改(那就是:它可能不再是同一个列表!)。

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

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

    从这个例子中可以清楚地看出ObservableCollection - 因为它支持一个特定的事件 - 在许多情况下会更有效率。也就是说,除非您在集合中拥有大量数据或非常复杂的UI,否则性能提升可以忽略不计。此外,如果您对列表进行大量修改,您可能会发现刷新整个列表的速度更快。

    最终,在没有重复咒语的情况下,StackOverflow上无法准确回答性能问题:对您的代码进行分析,并根据结果做出决定。