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

C#UI事件取消订阅-必要吗?,c#,events,C#,Events,我知道取消预订活动是必要的。 我的问题来自生成的代码: 从VS编辑器修改ui,并将事件处理程序添加到ui元素时(例如: private void BtnSampleClick(对象发送者,事件参数e)) 创建此事件处理时,VS将此代码添加到private void InitializeComponent()自动生成的代码中 this.btnSample.Click += new System.EventHandler(this.BtnSampleClick); 问题是VS不会在表单的Dispo

我知道取消预订活动是必要的。 我的问题来自生成的代码: 从VS编辑器修改ui,并将事件处理程序添加到ui元素时(例如:
private void BtnSampleClick(对象发送者,事件参数e)

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

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

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


谢谢你在这件事上帮我解释清楚

是的,明确取消订阅是一种很好的做法。尽管它们可能会导致内存泄漏,但只要它们不保留对非托管对象的任何引用,GC仍然可以正确地确定和清理托管世界中的对象。

您不必在意这一点。NET framework有一个垃圾收集器(GC),它使用自己的原理(可能是在没有对对象的引用时)自动进行处理


这并不意味着您将永远不需要调用Dispose函数,在某些情况下,您会故意调用Dispose()方法以避免内存耗尽,或者当我们使用本机dll/Marshal类时,这并没有完成,主要是因为在这种情况下确实不需要它。原因是您的表单正在订阅对象的事件,这些对象的生命周期由表单管理。当对象(即:按钮)从GC透视图中取出时,表单也将被取出(并关闭),因此没有内存泄漏的可能性。NET中的GC是智能的-像这样的循环引用不是问题

然而,取消订阅活动仍然是一种良好的常规做法。如果订阅对象上的事件,并且该对象的生存期与正在进行订阅的对象无关,则这一点变得非常重要。如果具有事件的对象的生存期比订阅者长得多,则尤其如此。在这种情况下,往往会发生事件导致的内存泄漏。例如,如果您的表单订阅了静态实例上的事件,并且忘记取消订阅,则该表单将永远不会被垃圾收集,因为委托引用将通过事件订阅使其保持“根目录”