这是内存泄漏吗?

时间:2010-07-30 06:03:54

标签: c# events

我有一个如下所示的课程。服务器实例保存对侦听器实例的引用。 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)
        {
            ...
        }
}

3 个答案:

答案 0 :(得分:1)

没有。 .NET垃圾收集器非常智能,可以解析循环引用。

答案 1 :(得分:1)

奇怪的是,我发现这种类型的代码一直在.net中泄漏,并且必须小心 - =事件处理程序。确实,内存最终会被发布,但实际上你想要比你更快地清理它。

此外,永远永远使用lambda表达式来处理事件,因为你永远不会有对该对象的引用。

答案 2 :(得分:0)

阅读this article about memory leaks。有时您应该使用 - =。