INotifyPropertyChanging接口如何帮助限制内存消耗

时间:2014-09-02 15:37:24

标签: c# .net windows-phone-8 linq-to-sql

我开始向Windows Phone 8学习LINQ-to-SQL,并在MSDN上发现了this文章。

它们显示了DataContext的基类,它实现了INotifyPropertyChangingINotifyPropertyChangedINotifyPropertyChanging的推理是:

  

◦INotifyPropertyChanged界面用于更改跟踪。

     

◦INotifyPropertyChanging接口有助于限制内存消耗   与变更跟踪有关。

该文章没有给出任何特定的引用来证明INotifyPropertyChanging接口的内存消耗声明。关于INotifyPropertyChanging本身的文章只是说:

  

通知客户端属性值正在发生变化。

有人可以向我解释一下这个界面如何限制应用程序的内存占用,只是通知一个属性值即将发生变化(甚至不会限制该变化发生)?

2 个答案:

答案 0 :(得分:3)

我只能推断,但我认为这是作者的想法:

在没有INotifyPropertyChanging的世界中,如果消费者需要属性的旧值,则必须先抢占它(因为,一旦PropertyChanged事件被提出,它也是如此迟到了,价值已经改变了)。或者,生产者可以在不同的属性中保留旧值的副本。无论哪种方式,数据始终都是重复的。

使用INotifyPropertyChanging,消费者不需要事先缓存任何内容。当PropertyChanging事件被引发时,它可以获取旧值,知道它即将发生变化。然后引发NotifyPropertyChanged事件,消费者可以获取新值,对两者执行任何操作,然后删除它们。数据仍然是重复的,但仅限于特定时间点和有限的持续时间。

答案 1 :(得分:2)

好的,我终于找到了另一个MSDN article,它实际上解释了INotifyPropertyChanging将如何限制内存占用。引用文章(强调我的):

  

通过属性设置器中的PropertyChanging事件提供通知。当LINQ to SQL 通知第一次更改对象时,它会创建对象的副本,并将该对象视为生成Update语句的候选对象。

     

对于未实现INotifyPropertyChanging的对象,LINQ to SQL   维护对象首次实现时所拥有的值的副本

因此,如果您没有实现INotifyPropertyChanging并且永远不会更新使用Linq-SQL获取的任何对象,那么它仍将为其创建的每个对象创建对象的副本。通过实现该接口,您可以避免额外的内存使用,并且只有在您实际对对象状态进行更改时才创建副本。