处理usercontrol时删除处理程序

时间:2011-08-03 14:16:27

标签: c# event-handling dispose

哪一个是正确的?

这一个:

protected override void Dispose(bool disposing)
{
    if (disposing && (components != null))
    {
        this.ctlRBContent1_GetBuildName -= _ctlBottom.GetBuildName;
        components.Dispose();
    }
    base.Dispose(disposing);
}

这一个:

~ ctlRemoteBuildContent1()
{
    this.ctlRBContent1_GetBuildName -= _ctlBottom.GetBuildName;
}

我试图切换这2个功能。当我进行UserControl处理时,它没有跳转到切换行:/

3 个答案:

答案 0 :(得分:2)

如果您在destructor中清理,则无法保证何时运行析构函数。具有析构函数的对象还需要更多的工作来让垃圾收集器处理。因此,最好实现IDisposable,这是你的第一个例子。

请注意,您的代码段并未完全实现推荐的IDisposable模式。请参阅此文章以获得完整且完整的解释:

http://www.csharphelp.com/2010/02/c-garbage-collecting-destructors-versus-dispose/

在您的代码段中,如果由于某种原因components为空,则不会删除事件处理程序。只应对components进行空检查以保护components.Dispose()来电。

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this.ctlRBContent1_GetBuildName -= _ctlBottom.GetBuildName;
        if (components != null)
        {
            components.Dispose();
        }
    }
    base.Dispose(disposing);
}

答案 1 :(得分:1)

第二位代码由终结器调用,这意味着你无法判断何时调用它(取决于垃圾收集器运行的时间)。理想情况下,您希望尽快释放资源,通常是在Dispose()中。所以在这里使用配置模式。

为什么要在此处取消订阅该活动?它包含什么?

答案 2 :(得分:0)

  

哪一个是正确的?

一个有点令人讨厌的答案是“两个”;-) ......

理想情况下,您希望在Dispose方法中进行整理,以便尽快执行,但在某些情况下,重要的是还要将析构函数调用的整理代码作为备份来进行备份。对象被使用而不被处理(...我想这取决于你认为这可能的可能性!?)

dispose模式(在其他答案中提到)提供了一种实现此方法的方法,无需在dispose和析构函数之间进行代码重复,并且使用GC.SupressFinalize确保对象的垃圾收集不会被不必要地阻止已经完成了。