当对象超出范围时,事件处理程序会发生什么?

Pau*_*tos 5 .net c# events 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!!
   }
}
Run Code Online (Sandbox Code Playgroud)

SomeEvent在"问题点"之后提出事件会发生什么?

And*_*rey 8

它将调用处理对象的方法.这就是取消订阅很重要的原因.它甚至可能导致内存泄漏.

  • @Hogan Disposing不等于垃圾收集.在这种情况下,`b`将永远不会被垃圾收集,因为在'a`的事件中仍然存在对它的引用(确切地说是问题).如果`b`的实现是正确的,它将抛出一个`ObjectDisposedException`. (5认同)