c#事件的垃圾清理
假设我有一个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
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
中引发事件
因此,我建议您这样做,只是为了将来验证代码