C# 这是内存泄漏吗?

C# 这是内存泄漏吗?,c#,events,C#,Events,我有一个如下所示的课程。服务器实例保存对侦听器实例的引用。侦听器通过事件委托保存对服务器实例的引用。这会阻止GC收集服务器实例吗?如果是这样,如何打破这个循环?我应该实现IDisposable、重写Finalize方法还是执行其他操作 public class Server { public Listener Listener { get; private set; } public Server(Listener lis

我有一个如下所示的课程。服务器实例保存对侦听器实例的引用。侦听器通过事件委托保存对服务器实例的引用。这会阻止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)
        {
            ...
        }
}
公共类服务器
{        
公共侦听器{get;private set;}
公共服务器(侦听器)
{
监听器=监听器;
Listener.ClientChannelConnected+=新事件处理程序(Listener\u ClientChannelConnected);
}        
无效侦听器\u ClientChannelConnected(对象发送方,ClientChannelConnectedArgs e)
{
...
}
}

不是。NET垃圾收集器足够聪明,可以解析循环引用。

奇怪的是,我发现这种类型的代码一直在.NET中泄漏,因此必须小心-=事件处理程序。的确,记忆最终会被释放,但实际上,你希望自己尽快清理干净


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

Read。有时你应该使用-=。

我不知道:(谢谢!如果其他对象仍有对保存委托列表的对象的引用,则会发生这种情况。在这种情况下,即使在您处理完服务器实例之后,侦听器仍在其他位置使用。这可能是您看到它们在内存中保留更长时间的原因。当您订阅事件的对象时,也可以使用Lambda。)n将在您希望事件被释放的同时被释放。当事件的生产者被释放时,它将丢失对其事件所持有的事件处理程序的引用,因此,这些对象可以依次被垃圾收集。