为什么在控件上使用弱事件模式而不是在其他地方管理生存期



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

使用弱事件模式的一个地方是Controls和DataModel之间的DataBinding。在DataBinding过程中,如果DataModel支持INotifyPropertyChange,则Control将通过事件要求DataModel就更改向他提供建议。如果没有弱事件,DataModel就会在控件上保留一个硬引用。由于该引用,无法在窗口可用于GC的同时将控件标记为可用于GC。

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

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

备选方案:用传递其子级UiElements的代码在Window上实现IDisposable,以便要求它们删除到DataModel的DataBinding?这个解决方案会出什么问题?

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

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

最新更新