我正在閱讀本書Under the hood of .NET memory management
(由Red-Gate出版)。你可以找到一個pdf version on their website。本書中的事件處理程序「.NET內存管理的底層」
我以爲我理解事件處理程序與發佈者和訂閱者之間創建的引用有關,但作者對第5章「特定於應用程序的問題」中的事件處理程序的解釋(標題爲「Windows Presentation Foundation」)迷惑了我。
在第160-161頁上,他們描述了一個使用主/從關係的UI設計。我引用(方括號中的數字是我的,爲了創建我的問題的參考,雙關語與其說意):
您可能必須與主記錄列表 一個網格,當你點擊來自主網格的記錄,將打開一個新窗口 ,其中包含與該主記錄相關的詳細信息。如果主窗口在詳細信息窗口[1]中連接了 事件,則無法收集詳細信息窗口,直到主窗口中的 事件處理程序釋放其對詳細信息窗口的引用[2]。在這個 的情況下,細節窗口將是監聽器,主窗口是源文件[3]。在大多數 的情況下,主窗口將超出詳細信息窗口,但如果事件處理程序 處理不當,則只要 主窗口處於活動狀態,就無法收集詳細信息窗口。
Detail.SomeEvent += new EventHandler(Master.SomeEvent_Handler); [4]
[1]這是術語非常不清楚。誰「連線」誰?僅憑這一點,我就無法確定誰是聽衆,誰是訂閱者(我只能假設......)。下一句[3]似乎回答了這個問題,說主人是信息來源,細節是聽衆,但是隻有在引入了混淆之後,在[2]中說明完全相反(因爲事件處理程序是主窗口中的而不是)。
代碼示例[4]也不符合[3]中的內容(但對應於[2])。如果主窗口是源,那麼它應該是:
Master.SomeEvent += new EventHandler(Detail.SomeEvent_Handler); [5]
對不對?
除了所有這些混亂,我理解事件處理程序如下。如果Master
有事件,Detail
訂閱(如[5]),那麼Master
對Detail
有抵觸(因爲對實例刪除的引用創建對實例的引用,在這種情況下爲Detail
)。因此,只要Master
生活,Detail
也將被保存在內存中,除非事件處理程序與事件分離。
我對這本書的批評和我自己的理解是否正確?
非顯而易見的'this'參數有什麼意義?它是否設置上下文(如在JavaScript?(赦免異端))?你能指點我一些文件或書嗎?我想了解更多。 – bvgheluwe
沒什麼特別深的。該事件正在調用一個實例方法,它需要一個對象引用。代表存儲它。請注意Delegate.Target屬性。看到它如何獲得價值並不容易。 –