C#UI事件取消订阅 - 必要吗?

sro*_*uez 4 c# events

我知道必须从事件中取消订阅.我的问题来自于生成的代码:当您修改从VS编辑器的用户界面,并添加事件处理程序的UI元素(例如: private void BtnSampleClick(object sender, EventArgs e))

在创建此事件处理时,VS会在private void InitializeComponent()自动生成的代码中添加此代码

this.btnSample.Click += new System.EventHandler(this.BtnSampleClick);
Run Code Online (Sandbox Code Playgroud)

问题是VS不会this.btnSample.Click -= new System.EventHandler(this.BtnSampleClick);在表单的Dispose方法中自动添加unsubscription().

通常我们应该在那里添加它们吗?如果不是这会泄漏到内存泄漏?想要检查VS是否有自动执行取消订阅的原因.即使我们不这样做,表格也可以正确处理?

谢谢你帮助我在这件事上轻描淡写!

Ree*_*sey 6

这没有做,主要是因为在这种情况下它实际上是不必要的.原因是您的表单订阅了由表单管理的生命周期的对象事件.当对象(即:按钮)从GC透视图中退出时,表单也将被无根(并且关闭),因此不存在内存泄漏的可能性..NET中的GC很聪明 - 像这样的循环引用不是问题.

但是,取消订阅活动仍然是一种很好的通用做法.如果您在一个对象上订阅一个事件变得很重要,该对象的生命周期与正在进行订阅的对象无关.如果具有事件的对象比订阅者长得多,则尤其如此.这种情况是事件引起的内存泄漏倾向于发生的地方.例如,如果您的表单订阅静态实例上的事件,并忘记取消订阅,则表单永远不会被垃圾收集,因为委托引用将通过事件订阅使其"生根".