Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#事件的垃圾清理_C#_Events - Fatal编程技术网

c#事件的垃圾清理

c#事件的垃圾清理,c#,events,C#,Events,假设我有一个c#类,可以像这样订阅: public class Emitter { public delegate void EmitAction(Emitter emitter); public event EmitAction OnEmitted; public void DoEmit() { if(OnEmitted != null) OnEmitted(this); } } …以及另一个使用它的类: public class EmissionU

假设我有一个c#类,可以像这样订阅:

public class Emitter {
  public delegate void EmitAction(Emitter emitter);
  public event EmitAction OnEmitted;

  public void DoEmit() {
     if(OnEmitted != null)
       OnEmitted(this);
  }
}
…以及另一个使用它的类:

public class EmissionUser {

   public void SomeFunction() {
      Emitter em = new Emitter();
      em.OnEmitted += HandleIt;
      em.DoEmit();
   }

   public void HandleIt(Emitter em) {
      //I could just do em -= HandleIt, but is there any point?
   }
}
我知道,为了代码整洁和避免内存泄漏,在使用事件时,每次订阅都有一次取消订阅总是好的。但是,在这种情况下,发射器实例是在SomeFunction()中本地创建的,并且没有在内存中保存太长时间,因此我猜事件订阅会被本地实例破坏


在handler中取消订阅仍然是个好主意吗?如果是,原因是什么?

是的,您不需要取消订阅,因为正如您所说,
em
变量在
SomeFuction
返回后被销毁,并且没有其他人引用此对象,因此垃圾收集器可以清理它。

好吧,
em
是本地实例,将在
HandleIt
结束时销毁。如果您不打算在其他任何地方使用它,您可以选择将其保留为那样

但是如果你在其他地方有它的参考,或者将来要创建一个,它会产生问题。此外,找到与事件相关的bug的根本原因也很棘手

我注意到您正在传递
发射器
引用。有人可以再次使用相同的引用调用不同的方法或在
handleIt
中引发事件

因此,我建议您这样做,只是为了将来验证代码