垃圾收集器和事件处理程序

L.E*_*E.O 8 c# events garbage-collection

一个简单的问题.假设我有一个如下例所示的类.

class Subscriber
{
    private Publisher publisher = new Publisher;


    public Subscriber()
    {
       publisher.SomeEvent += new EventHandler(OnEventFired);
    }

    private void OnEventFired(object sender, EventArgs e)
    {
    }

}
Run Code Online (Sandbox Code Playgroud)

在程序的某个地方,我有一个看起来像这样的方法:

public void DoSomething()
{
    Subscriber subscriber = new Subscriber();
}
Run Code Online (Sandbox Code Playgroud)

我是否正确地期望这会导致内存泄漏,因为订阅者永远不会取消订阅发布者事件,从而导致他们都保持对彼此的强引用?

Jon*_*eet 16

它不会导致泄漏 - GC可以毫无问题地处理循环引用.

然而,这将意味着出版商将切实给用户一个参考,所以用户不能被垃圾收集,直到出版商可享有GC,或者从事件退订.

  • @LEO:没有矛盾.如果没有其他任何内容涉及这两个对象,它们都有资格收集.如果你保留对`Subscriber`的引用,那么由于实例变量,它将使`Publisher`保持活动状态.如果你保留对`Publisher`(其他地方)的引用,那么由于事件订阅,这将使`Subscriber`保持活跃状态​​. (5认同)
  • 嗯......这里有点困惑.您说订阅者只会在收集发布者时收集,但在我的情况下,发布者是订阅者的实例变量,只有在收集订阅者时才会收集.但与此同时,你说GC应该处理循环引用没有问题.我在这里遗漏了什么,或者你的陈述中有矛盾吗? (2认同)