3

我了解弱引用和弱事件模式。

使用弱事件模式的一个地方是在控件和数据模型之间的数据绑定中。在DataBinding过程中,如果DataModel支持INotifyPropertyChange,Control会通过事件请求DataModel通知他改变。如果没有弱事件,DataModel 将在控件上保留一个硬引用。由于该引用,无法在窗口变为可用于 GC 的同时将控件标记为可用于 GC。

微软决定使用弱引用来解决这个问题。

我想知道像提议的其他替代方案是否会更好?

替代方案:使用传递其子 UiElements 的代码在 Window 上实现 IDisposable 以要求他们将其 DataBinding 删除到 DataModel ?该解决方案有什么问题?

4

1 回答 1

5

使用弱事件有一个基本优势:将 Control 与 DataModel 解除绑定的任务留给垃圾收集器本身。垃圾收集器通常在低优先级线程中运行,该线程仅在系统空闲或需要释放内存时才被激活,因此它不会减慢其他活动的速度。相比之下,让 IDisposable 将 Control 从 DataModel 中分离出来意味着,如果您手动处置 Control,则必须在常规调用者的线程中进行解除绑定。

另一个方面(这是 MVC 模式强制要求的)是让模型独立于视图。如果您将对象生命周期视为依赖项,那么弱引用正是保持模型独立所需要的,因为您不必依赖控件的合作来释放绑定。

于 2012-09-05T00:22:53.150 回答