2011-02-09 81 views
2

我們可以使用下面的結構來聲明一個事件:是否使用禁用lambda表達式來初始化事件阻止GC?

public class MyClass 
{ 
    public event EventHandler<EventArgs> SomeEvent = (s,e) => {}; 

    public void SomeMethod() 
    { 
     // Do something interesting... ;) 
     SomeEvent (this, new EventArgs); 
    } 
} 

,允許引發事件,而不需要檢查該事件是否爲空。

現在,讓我們假設一個對象A持有對MyClass對象的引用,註冊該事件,然後稍後取消註冊。

var myClass = new MyClass(); 
myClass.SomeEvent += MyHandler; 
... 
myClass.SomeEvent -= MyHandler; 
myClass = null; 

即使在事件中仍然存在無操作lambda表達式,GC是否會收集myClass?

我想是這樣,因爲對象根目錄不再被其他對象引用......任何人都可以確認或證明其他嗎?

回答

3

使用問題中的代碼,即使您不退訂,GC也會收集myClass。這種關係是相反的。 MyClass的事件持有用戶的參考,所以理論上你應該擔心用戶沒有被收集。如果您退訂,訂戶將被收取。

+0

我已經在今天下午兩次Skeeted,它只是在這裏15:45 :) – Stilgar 2011-02-09 13:45:54

6

即使您沒有刪除「真實」處理程序,也可以收集MyClass的實例。

正常「泄漏」的事件是事件出版商MyClass在這種情況下)具有經由訂閱的事件處理程序的引用,另一個對象。事件不會阻止發佈者被垃圾收集。 no-op lambda當然對此沒有影響。