2010-12-08 113 views
0

我有一個關於.net垃圾回收的簡單問題。在下面的代碼中,我在子對象的構造函數中創建了一個偵聽器類實例。我的問題是監聽器類是否由子對象或主對象之前的垃圾回收收集,因爲在任何地方都沒有直接引用它?.net C#垃圾回收問題

class MainObject 
{ 
    public void DoSomething() 
    { 

    } 
} 

delegate void someEventHandler(); 
class ChildObject 
{ 
    public event someEventHandler SomeEvent; 
    MainObject main; 
    public ChildObject(MainObject main) 
    { 
     this.main = main; 
     new Listener(this, main); 
    } 
} 


class Listener 
{ 
    MainObject main; 

    public Listener(ChildObject child, MainObject main) 
    { 
     this.main = main; 
     child.SomeEvent += new someEventHandler(child_SomeEvent); 
    } 
    void child_SomeEvent() 
    { 
     main.DoSomething(); 
    } 
} 

回答

6

對它的引用,在調用列表child.SomeEvent

懸掛事件處理程序是.NET應用程序中內存泄漏的首要原因。

一旦child對象被收集,它將被收集,但如果您希望在收集之前收集它,則需要將它從調用列表中刪除(通過使用-=運算符)。

2

GC的目的是讓您不必擔心收集事情的時間。當他們不再需要,並且沒有特別的順序時,他們會被收集起來。沒有辦法保證在另一個對象之前收集一個對象。