“书本中的事件处理程序”;在.NET内存管理的引擎罩下“;

“书本中的事件处理程序”;在.NET内存管理的引擎罩下“;,.net,memory-management,event-handling,.net,Memory Management,Event Handling,我正在.NET内存管理(由Red Gate出版)的保护下阅读这本书。你可以找到一份工作 我原以为我理解事件处理程序是关于发布者和订阅者之间创建的引用,但作者在第5章“应用程序特定问题”(标题为“Windows演示文稿基金会”)中对事件处理程序的解释让我感到困惑 在第160-161页,它们描述了使用主/细节关系的UI设计。我引用(方括号中的数字是我的,为了给我的问题提供参考,用双关语来说并不是有意的): 您可能有一个带有列表的网格 当您单击主网格中的记录时,将显示一个新窗口 打开时显示与该主记录关

我正在.NET内存管理(由Red Gate出版)的保护下阅读这本书。你可以找到一份工作

我原以为我理解事件处理程序是关于发布者和订阅者之间创建的引用,但作者在第5章“应用程序特定问题”(标题为“Windows演示文稿基金会”)中对事件处理程序的解释让我感到困惑

在第160-161页,它们描述了使用主/细节关系的UI设计。我引用(方括号中的数字是我的,为了给我的问题提供参考,用双关语来说并不是有意的):

您可能有一个带有列表的网格 当您单击主网格中的记录时,将显示一个新窗口 打开时显示与该主记录关联的详细信息。如果主窗接通电源 事件,则在 主窗口中的事件处理程序释放对详细信息窗口的引用[2]。在这个 在这种情况下,细节窗口将是侦听器,主窗口是源[3]。大多数 在某些情况下,主窗口将比详细信息窗口更有效,但如果事件处理程序 如果处理不正确,则只要 主窗口是活动的

[1] 这是一个非常不清楚的术语。谁“连线”谁?仅凭这一点,我无法确定谁是听众,谁是订阅者(我只能假设…)。下一句话[3]似乎回答了这个问题,说主程序是源,细节是侦听器,但只是在引入了混淆之后,在[2]中指出了完全相反的内容(因为主窗口中没有事件处理程序)

代码示例[4]也不符合[3]中所述内容(但与[2]相对应)。如果主窗口是源,则应为:

Master.SomeEvent += new EventHandler(Detail.SomeEvent_Handler); [5]
对吧?

除了这些混乱之外,我对事件处理程序的理解如下。如果
Master
Detail
订阅的事件(如[5]),则
Master
引用
Detail
(因为对实例删除的引用会创建对实例的引用,在这种情况下,
Detail
)。因此,只要
Master
存在,
Detail
也将保存在内存中,除非事件处理程序与事件解耦


我对这本书的评论和我自己的理解正确吗?

从C#syntax sugar来看,这从来都不是很明显。委托构造函数包含两个参数。最明显的是事件处理程序方法。不明显的是要调用其处理程序方法的对象。不明显,因为您从未在代码中键入它。这是
这个
。C#甚至不允许您指定它,其他语言则允许

因此,主对象现在如何创建对细节对象的引用,这是正确调用事件处理程序方法所必需的

因此,只要主对象处于活动状态,就不会收集细节对象。除非再次明确取消订阅事件或使用WPF弱事件模式。或者,理想情况下,设计代码使主对象和细节对象同时消亡。他们给了你一个不容易做到的例子


还有其他不使用事件的方法。您可以声明一个IDetail接口,其中包含表示您希望引发的事件的方法。并为主类提供AddDetail(IDetail)和RemoveDetail(IDetail)方法。现在,内存管理非常清晰,当您忘记调用RemoveDetail()时,它会变得更加明显。然而,WPF设计者非常喜欢使用事件,他们必须提出弱事件模式,以避免在他们自己的对象模型中出现漏洞。

不明显的
这个
参数的意义是什么?它是否设置了上下文(如javascript?(请原谅异端邪说))?你能给我指一些文件或书吗?我想多读一些,没有什么特别深刻的。事件正在调用实例方法,它需要对象引用。代理存储它。请注意Delegate.Target属性。很难看出它是如何得到一个值的。
Master.SomeEvent += new EventHandler(Detail.SomeEvent_Handler); [5]