.net C#垃圾收集问题

时间:2010-12-08 11:55:13

标签: c# .net garbage-collection

我有关于.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();
    }
}

3 个答案:

答案 0 :(得分:6)

在调用列表child.SomeEvent中,对它的引用。

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

收集child对象后将收集它,但是如果您希望在手边收集它,则需要将其从调用列表中删除(使用-=运算符)。< / p>

答案 1 :(得分:2)

GC的目的是让您不必担心收集的时间。当它们不再需要而且没有特定的顺序时,它们就会被收集起来。无法保证在另一个对象之前收集一个对象。

答案 2 :(得分:1)

正如Oded所说,有一个参考。如果想避免这种情况,可以查看试图解决内存泄漏问题的弱事件模式:

http://msdn.microsoft.com/en-us/library/aa970850.aspx