哪一个是正确的?
这一个:
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处理时,它没有跳转到切换行:/
答案 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确保对象的垃圾收集不会被不必要地阻止已经完成了。