.net C#垃圾收集问题

.net C#垃圾收集问题,c#,.net,garbage-collection,C#,.net,Garbage Collection,我有一个关于.net垃圾收集的简单问题。在下面的代码中,我在子对象的构造函数中创建了一个侦听器类实例。我的问题是,侦听器类是否在子对象或主对象之前被垃圾收集,因为它在任何地方都没有直接引用 class MainObject { public void DoSomething() { } } delegate void someEventHandler(); class ChildObject { public event someEventHandler So

我有一个关于.net垃圾收集的简单问题。在下面的代码中,我在子对象的构造函数中创建了一个侦听器类实例。我的问题是,侦听器类是否在子对象或主对象之前被垃圾收集,因为它在任何地方都没有直接引用

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();
    }
}
在调用列表
child.SomeEvent
中有对它的引用

悬空事件处理程序是.NET应用程序内存泄漏的首要原因


一旦收集了
子对象
它就会被收集,但是如果你想在收集之前收集它,你需要将它从调用列表中删除(通过使用
-=
操作符)。

GC的目的是让你不必担心什么时候会被收集。当不再需要它们时,它们会被收集起来,并且没有特定的顺序。没有办法保证一个对象在另一个对象之前被收集。

正如Oded所说,有一个对它的引用。如果要避免这种情况,可以查看尝试解决内存泄漏问题的弱事件模式: