为了账号安全,请及时绑定邮箱和手机立即绑定

完成vs Dispose

完成vs Dispose

C#
摇曳的蔷薇 2019-08-24 15:01:00
完成vs Dispose为什么有些人在Finalize方法上使用该Dispose方法?在什么情况下你会使用Finalize方法而不是Dispose方法,反之亦然?
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

其他人已经介绍了Dispose和之间的区别Finalize(顺便说一下,这个Finalize方法在语言规范中仍然被称为析构函数),所以我只想添加一些关于Finalize方法派上用场的方案。

某些类型以易于使用的方式封装一次性资源,并在一次操作中处理它们。一般用法通常是这样的:打开,读取或写入,关闭(Dispose)。它非常适合using构造。

其他人则有点困难。WaitEventHandles因为它们用于从一个线程发送到另一个线程,所以实例不会像这样使用。那么问题就变成谁应该呼吁Dispose这些?作为这样的安全措施类型实现了一种Finalize方法,该方法确保在应用程序不再引用实例时处理资源。


查看完整回答
反对 回复 2019-08-24
?
胡子哥哥

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);
     }


查看完整回答
反对 回复 2019-08-24
  • 3 回答
  • 0 关注
  • 383 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信