INotifyPropertyChanging接口如何帮助限制内存消耗
我开始学习Windows Phone 8的LINQ-to-SQL
,并在MSDN上看到了这篇文章。
它们显示了DataContext
的基类,它实现了INotifyPropertyChanging
和INotifyPropertyChanged
。 INotifyPropertyChanging
是:
◦INotifyPropertyChanged接口用于更改跟踪。
◦INotifyPropertyChanging接口有助于限制与更改跟踪相关的内存消耗。
本文未能提供任何特定的引用来certificateINotifyPropertyChanging
接口的内存消耗声明。 关于INotifyPropertyChanging本身的文章只是说:
通知客户端属性值正在更改。
有人可以向我解释这个界面如何限制应用程序的内存占用,只需通知一个属性值即将发生变化(甚至不会限制该变化发生)?
我只能推断,但我认为这是作者的想法:
在没有INotifyPropertyChanging
的世界中,如果消费者需要属性的旧值,它必须抢先缓存它(因为,一旦引发了PropertyChanged
事件,它就太晚了,值已经改变了)。 或者,生产者可以在不同的属性中保留旧值的副本。 无论哪种方式,数据始终保持重复。
使用INotifyPropertyChanging
,消费者不需要事先缓存任何内容。 引发PropertyChanging
事件时,它可以获取旧值,知道它将要更改。 然后NotifyPropertyChanged
事件,消费者可以获取新值,对两者执行任何操作,然后删除它们。 数据仍然是重复的,但仅限于特定时间点和有限的持续时间。
好的,我终于找到了另一篇MSDN文章 ,它实际上解释了INotifyPropertyChanging
如何限制内存占用。 引用文章(强调我的):
通过属性设置器中的PropertyChanging事件提供通知。 当LINQ to SQL 收到对对象的第一次更改的通知时,它会创建该对象的副本 ,并将该对象视为生成Update语句的候选对象。
对于未实现INotifyPropertyChanging的对象,LINQ to SQL 维护对象在首次实现时所具有的值的副本 。
因此,如果您没有实现INotifyPropertyChanging
并且永远不会更新使用Linq-SQL获取的任何对象,它仍将为其创建的每个对象创建对象的副本。 通过实现该接口,您可以避免额外的内存使用,并且只有在您实际对对象状态进行更改时才创建副本。