.net C#垃圾收集问题
我有一个关于.net垃圾收集的简单问题。在下面的代码中,我在子对象的构造函数中创建了一个侦听器类实例。我的问题是,侦听器类是否在子对象或主对象之前被垃圾收集,因为它在任何地方都没有直接引用.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
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所说,有一个对它的引用。如果要避免这种情况,可以查看尝试解决内存泄漏问题的弱事件模式: