2009-01-20 212 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並不罕見,就像你必須將文件的打開和關閉配對或者在不使用自動垃圾收集的語言中配對新/刪除調用一樣)。

這些合同中的每一個都可以在運行時進行一定程度的測試。例如,可以檢測並報告一個觀察員分離的次數超過它所附加的次數(根據情況斷言或異常)。

所以,你的問題是:

從理論上講,是它認爲更 正確的代碼添加 處理程序的目的是記住 刪除它不是假設的對象 將自身清潔起來在 超出範圍之前?

是現貨。答案是肯定的,不僅在理論上,而且在實踐中。在我看來,這些合同可以幫助您避免在地毯下發生徹底的錯誤。

規定這種方式不用思考,你很好地建立真正強大的軟件。