【发布时间】:2010-05-04 14:17:19
【问题描述】:
在lightweight event这个词上跑了几次。文中没有附上任何代码 sn-ps 来弄清楚该术语背后的想法。
如果有人能解释什么是轻量级事件并举个例子,我将不胜感激。
【问题讨论】:
-
这里有一个很好的学习指南stackoverflow.com/questions/185931/…
在lightweight event这个词上跑了几次。文中没有附上任何代码 sn-ps 来弄清楚该术语背后的想法。
如果有人能解释什么是轻量级事件并举个例子,我将不胜感激。
【问题讨论】:
当您将事件处理程序添加到事件(或将方法组添加到委托,实际上)时,委托将持有对该方法组所在对象的引用,如果它是实例方法。
换句话说,触发事件的对象将在订阅事件时保留正在接收事件的对象。
因此,如果您使用完接收事件的那个对象,即使您用完它并释放所有引用(无需取消订阅),它仍然存在(并响应事件)。
这导致了对lightweight events 的渴望,这是不保留引用的事件。
这不默认在 .NET 框架中提供,所以如果你想实现它,你必须使用 add and remove accessors when declaring your event 和 @987654322 @ 存储通过隐式值参数传递的委托。
然后,当您触发事件时,您将检查您的 WeakReference 集合(您必须单独维护它才能执行此操作),特别是 IsAlive 和 Target 属性以确定是否已收集委托。如果不是,那么您将执行它,否则,您将通过它(并最有可能压缩您的列表)。
【讨论】: