Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 性能,使用Observable collection还是INotifyPropertyChange更好?_C#_Performance_C# 4.0 - Fatal编程技术网

C# 性能,使用Observable collection还是INotifyPropertyChange更好?

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

我必须用c语言编写一些程序,并且为了在程序之间执行IO,我必须使用
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
  • 使用选项1,当您修改列表时,会引发一个事件,显示“整个列表已更改”。如果有一个UI元素绑定到此列表(例如,
    ListBox
    ),则必须重新绘制整个元素,因为它必须假设整个列表已更改(即:它可能不再是相同的列表!)

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

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

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


    归根结底,在StackOverflow上,如果不重复以下咒语,就无法准确回答任何性能问题:分析代码,并根据结果做出决定。

    为什么不使用最适合您设计的代码编写一些代码呢?现在想想这类事情,你并没有把注意力集中在手头的问题上。好吧,两者都有相同的设计——一个字符串列表或一个可观察的字符串集合,我的问题不是关于设计,而是performance@user2417992那么做一个基准:)我想,但我不能,我正在为一个程序制作某种插件,我需要列表的内容,例如字符串,我试着看看插件是否工作,但我不知道第二个程序的来源。@user2417992你不需要插件来做基准测试。只需创建一个小程序,对两个senarios进行压力测试,然后比较它们。我可以在列表上使用notifyPropertychange,它们实际上做的是相同的事情。如果你愿意,有一个不同的