我有一个如下所示的课程。服务器实例保存对侦听器实例的引用。 Listener通过事件委托保存对服务器实例的引用。这会阻止GC收集服务器实例吗?如果是这样,如何打破这个循环?我应该实现IDisposable还是覆盖Finalize方法还是做其他事情?
public class Server
{
public Listener Listener { get; private set; }
public Server(Listener listener)
{
Listener = listener;
Listener.ClientChannelConnected += new EventHandler<ClientChannelConnectedArgs>(listener_ClientChannelConnected);
}
void listener_ClientChannelConnected(object sender, ClientChannelConnectedArgs e)
{
...
}
}
答案 0 :(得分:1)
没有。 .NET垃圾收集器非常智能,可以解析循环引用。
答案 1 :(得分:1)
奇怪的是,我发现这种类型的代码一直在.net中泄漏,并且必须小心 - =事件处理程序。确实,内存最终会被发布,但实际上你想要比你更快地清理它。
此外,永远永远使用lambda表达式来处理事件,因为你永远不会有对该对象的引用。
答案 2 :(得分:0)
阅读this article about memory leaks。有时您应该使用 - =。