2009-01-20 219 views
8

我可以想出几个凌乱的方法来解决这个问题,但它让我觉得应该有一个比我已经提出的更优雅的解决方案。删除处理程序处理对象

对象在处置之前清理所有事件处理程序的最合适方式是什么?这是一个耻辱事件处理程序无法枚举。

从理论上讲,将代码处理程序添加到对象中以便记住将其删除,而不是假设对象在超出作用域之前将其自行清理,这会更加正确吗?

回答

9

从理论上讲,它被认为更 正确的代码添加 处理程序的目的是记住 删除它不是假设它会 超出范围之前的对象 将清理自己吗?

对于上述问题,我必须说是。关于事件的基本理论是事件消防员不应该负责管理自己的处理程序;谁添加了事件应该做清理。

+0

不够公平。非常感谢您提供快速且有用的答案。 – Kivin 2009-01-20 09:05:53

10

有一种方法可以避免与事件有关的常见问题 - WeakEvent pattern

+1

链接已死,请修复它。 – 2015-07-18 17:23:27

0

事件处理程序对我来说是.NET应用程序内存消耗的最大威胁,尤其是当您在Web服务器上下文中使用它时。对我来说,永远是对象本身的责任。附加对象应该始终具有与其所附着的对象相同的较小或相等的寿命,否则在设计事件时存在问题,因为您不希望再次通知没有意义的对象的变化。如果他们的寿命是平等的,他们将一起超出范围,如果它短于附着物必须分离,则不需要做任何事情。在基本的Web应用程序中,您只有3种类型的应用程序,应用程序,会话和页面,并且规则很容易应用。在更复杂的应用中,这需要更多的思考。

5

在我的设计,我很严格定义诸如合同:

  • 每个资源获取,必须有释放
  • 每次调用启动服务配对必须调用停止服务配对
  • 每个附接到受试者观察者必须分离

(例如合同s并不罕见,就像你必须将文件的打开和关闭配对或者在不使用自动垃圾收集的语言中配对新/删除调用一样)。

这些合同中的每一个都可以在运行时进行一定程度的测试。例如,可以检测并报告一个观察员分离的次数超过它所附加的次数(根据情况断言或异常)。

所以,你的问题是:

从理论上讲,是它认为更 正确的代码添加 处理程序的目的是记住 删除它不是假设的对象 将自身清洁起来在 超出范围之前?

是现货。答案是肯定的,不仅在理论上,而且在实践中。在我看来,这些合同可以帮助您避免在地毯下发生彻底的错误。

规定这种方式不用思考,你很好地建立真正强大的软件。