繁体   English   中英

当 object 超出 scope 时,事件处理程序会发生什么情况?

[英]What happens with event handlers when an object goes out of scope?

假设我们有以下设置:

public class ClassA
{
   public event EventHandler SomeEvent;
}

public class ClassB : IDisposable
{
   public void SomeMethod(ClassA value)
   {
      value.SomeEvent += (s, e) => { DoSomething(); };
   }

   void DoSomething() { }

   void Dispose() { }
}

public static class Program
{
   static void Main()
   {
      var a = new ClassA();

      using (var b = new ClassB())
         b.SomeMethod(a);

      // POINT OF QUESTION!!
   }
}

在“问题点”之后引发事件SomeEvent会发生什么?

它将调用已处理的 object 的方法。 这就是为什么取消订阅很重要。 它甚至会导致 memory 泄漏。

您应该使用 ClassB 的Dispose()方法取消订阅 ClassA 事件。 您冒着类没有被垃圾收集的风险,这当然会导致潜在的 memory 泄漏。 您应该始终取消订阅事件。

你上面没有任何东西可以解开你的事件处理程序。 由于ab go 同时从 scope 出来,你会很安全。 既然ab都可以被收集,那么a不会让b活着。

如果您要在 using 语句之后引发ClassA.SomeEvent事件,那么即使b已被释放,也会调用ClassB.DoSomething 在这种情况下,您必须显式删除事件处理程序。

如果您要在其他地方保留对a的引用,那么b将由a保持活动状态。 同样,因为事件处理程序尚未被删除。

没有什么。 运行时不知道Dispose方法,并且在 using 语句中调用此方法对 memory 管理没有任何作用。

垃圾收集是关于 memory 管理的,但IDisposable (和Finalizer )是关于资源管理的,所以你仍然应该考虑自己并手动实现它(并且适当地,例如在Dispose中取消订阅)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM