3 回答
TA贡献1802条经验 获得超10个赞
其他人已经介绍了Dispose和之间的区别Finalize(顺便说一下,这个Finalize方法在语言规范中仍然被称为析构函数),所以我只想添加一些关于Finalize方法派上用场的方案。
某些类型以易于使用的方式封装一次性资源,并在一次操作中处理它们。一般用法通常是这样的:打开,读取或写入,关闭(Dispose)。它非常适合using构造。
其他人则有点困难。WaitEventHandles因为它们用于从一个线程发送到另一个线程,所以实例不会像这样使用。那么问题就变成谁应该呼吁Dispose这些?作为这样的安全措施类型实现了一种Finalize方法,该方法确保在应用程序不再引用实例时处理资源。
TA贡献1825条经验 获得超6个赞
摘要是 -
如果它引用了非托管资源,并且您希望确保在自动对垃圾回收该类的实例时释放这些非托管资源,则为您的类编写终结器 。请注意,您无法显式调用对象的Finalizer - 垃圾收集器会在其认为必要时自动调用它。
另一方面,当您的类引用了非托管资源时,您实现了IDisposable接口(并因此为您的类定义了Dispose()方法)但您不想等待垃圾收集器启动(可以随时 - 无法控制程序员)并希望在完成后立即释放这些资源。因此,您可以通过调用对象的Dispose()方法显式释放非托管资源。
另外,另一个区别是 - 在Dispose()实现中,您也应该释放托管资源,而不应该在Finalizer中完成。这是因为在准备好最终确定之前,对象引用的托管资源很可能已经被清除。
对于使用非托管资源的类,最佳做法是定义Dispose()方法和Finalizer,以便在开发人员忘记显式处理对象时将其用作回退。两者都可以使用共享方法来清理托管和非托管资源: -
class ClassWithDisposeAndFinalize : IDisposable{
// Used to determine if Dispose() has already been called, so that the finalizer
// knows if it needs to clean up unmanaged resources.
private bool disposed = false;
public void Dispose()
{
// Call our shared helper method.
// Specifying "true" signifies that the object user triggered the cleanup.
CleanUp(true);
// Now suppress finalization to make sure that the Finalize method
// doesn't attempt to clean up unmanaged resources.
GC.SuppressFinalize(this);
}
private void CleanUp(bool disposing)
{
// Be sure we have not already been disposed!
if (!this.disposed)
{
// If disposing equals true i.e. if disposed explicitly, dispose all
// managed resources.
if (disposing)
{
// Dispose managed resources.
}
// Clean up unmanaged resources here.
}
disposed = true;
}
// the below is called the destructor or Finalizer
~ClassWithDisposeAndFinalize()
{
// Call our shared helper method.
// Specifying "false" signifies that the GC triggered the cleanup.
CleanUp(false);
}- 3 回答
- 0 关注
- 473 浏览
添加回答
举报
