【问题标题】:How does INotifyPropertyChanging interface helps limit memory consumptionINotifyPropertyChanging 接口如何帮助限制内存消耗
【发布时间】:2014-09-02 15:37:23
【问题描述】:

我开始为 Windows Phone 8 学习 LINQ-to-SQL,并在 MSDN 上看到了 this 文章。

他们展示了DataContext 的基类,它实现了INotifyPropertyChangingINotifyPropertyChangedINotifyPropertyChanging 的原因是:

◦INotifyPropertyChanged 接口用于更改跟踪。

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

这篇文章没有给出任何具体的参考来证明INotifyPropertyChanging 接口的内存消耗是合理的。 INotifyPropertyChanging 上的文章本身只是说:

通知客户端属性值正在更改。

有人可以向我解释一下这个接口如何限制应用程序的内存占用,只需通知属性值即将更改(甚至不限制更改发生)吗?

【问题讨论】:

  • 也许你的意见会被听到here
  • 同意,这是一个内容相当贫乏的 API 文档页面。我不熟悉那个界面,但我最近提出了一个关于绑定依赖属性的问题,并认为您可能偶然发现了一个潜在的答案。
  • 没有多大意义。当你不使用INotifyPropertyChanged .NET uses the much more heavy PropertyDescriptor 来跟踪更改时。但据我所知,它适用于我提到的那个,而不是INotifyPropertyChanging,所以不知道他们为什么写这个。
  • @Okuma.Scott 事实上,我为 WPDev 用户的声音创建了一个,wpdev.uservoice.com/forums/110707-docs/suggestions/…
  • 这是主观的,但可以猜测。通过推动客户端代码检测更改的负担,框架不必再保留旧数据并自行检测更改。当然,这使得它使用更少的内存。并使数据绑定更加高效。但是,没有 INotifyPropertyChangeReverted,所以它不像是小菜一碟。

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


【解决方案1】:

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

在没有INotifyPropertyChanging的世界中,如果消费者需要一个属性的旧值,它必须抢先缓存它(因为一旦引发PropertyChanged事件,就太晚了,值已经改变了) .或者,生产者可以将旧值的副本保存在不同的属性中。无论哪种方式,数据始终保持重复。

使用INotifyPropertyChanging,消费者不需要事先缓存任何东西。当PropertyChanging 事件被引发时,它可以获取旧值,知道它即将改变。然后引发NotifyPropertyChanged 事件,消费者可以获取新值,对两者执行任何操作,然后丢弃它们。数据仍然是重复的,但只是在特定的时间点和有限的时间内。

【讨论】:

  • 我将此作为答案,因为原始文章说“帮助限制”,并没有说它实际上限制了内存占用。但是您是否知道绑定到这些接口的任何控件,实际上根据 INotifyPropertyChanging 的存在而在行为上有所不同?
  • @Adarsha 我没有。如果我要开发一个控件,我可能不会支持 INotifyPropertyChanging,因为我知道它几乎没有实现
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 2022-10-05
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多