`
CanBeatle
  • 浏览: 169180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Finalize和Dispose

    博客分类:
  • C#
阅读更多

1. Finalize()从object中继承过来,GC会定期调用该方法来回收内存。编程时不需要覆写Finalize()方法。当我们需要自己定义Finalize()方法时(一般只用于回收非托管资源),并非直接override该方法,可以通过这种方式来覆写:

 class Test
   {
   
    // Some Code
   
    ~Test
    {
       //Necessary cleanup code
    }
   }

    类似于C++的析构函数,.net Framework 会将该析构函数转换成这样的形式: 

protected override void Finalize()
   {
       try
       {
           //Necessary cleanup code
       }
       finally
       {
           base.Finalize();
       }
   }

   

2.  由于我们不能控制GC什么时候去回收内存,所以Finalize的调用时机是不定的,当非常紧急需要回收内存时,我们也不能调用Finalzie()强制回收,这时候就可以使用Dispose():

 public interface IDisposable
   {
      void Dispose();
   }

  Dispose()需要手动调用,调用后并不是释放自己,而是等待GC回收(Dispose()后GC可以直接回收了)。
可以将Finalize()和Dispose()结合起来以防止忘记调用Dispose():

public class Base: IDisposable
   {
     private bool isDisposed = false;
   
      public void Dispose() 
      {
         Dispose(true);
         GC.SuppressFinalize(this); 
      }
      protected virtual void Dispose(bool disposing) 
      {
         if(!isDisposed)
         {
          if (disposing) 
          {
             // Code to dispose managed resources 
             // held by the class
          }
         }      
        // Code to dispose unmanaged resources 
        // held by the class
       isDisposed = true;
       base.Dispose(disposing);
      }
      ~Base()
      {
         Dispose (false);
      }
   }
   
   public class Derived: Base
   {   
      protected override void Dispose(bool disposing) 
      {
         if (disposing) 
         {
            // Code to cleanup managed resources held by the class.
         }
            
         // Code to cleanup unmanaged resources held by the class.
         
        base.Dispose(disposing);
      }
   // Note that the derived class does not // re-implement IDisposable
   }

 

 

分享到:
评论

相关推荐

    c#中的非托管资源释放 (Finalize和Dispose)

    ### C#中的非托管资源释放 (Finalize和Dispose) 在深入了解`Finalize`与`Dispose`之前,我们首先需要理解两个基本概念:托管资源与非托管资源。 #### 托管资源与非托管资源 1. **托管资源**指的是由.NET运行时...

    C++编制程序人员容易犯地10个C#错误.doc

    ### C++程序人员容易犯的10个C#错误 ...正确使用`Finalize`和`Dispose`不仅有助于提高代码的质量,还能确保应用程序的稳定性和性能。通过遵循上述指导原则,C++背景的程序员可以更加顺利地适应C#的开发环境。

    C++程序员容易犯的十个C#错误

    C#程序员需要理解.NET Framework的垃圾收集机制,以便正确地使用Finalize和Dispose方法。 错误7:没有正确地使用基类的Finalize方法 在C#中,需要显示地调用基类的Finalize方法,以便正确地释放非托管资源。 错误...

    C++编程人员容易犯的10个C#错误

    C#的垃圾回收机制虽然减轻了内存管理的负担,但对于非托管资源的处理,C#提供了一套更加精细且强大的工具集,包括`Finalize`、`Dispose`和`using`语句。熟练掌握这些机制,可以帮助C++背景的开发人员避免常见的陷阱...

    .NET类库开发的设计准则.pdf

    文档中提到了实现Finalize和Dispose方法以清理非托管资源的最佳实践,以及如何合理使用超时。 总之,这份文档提供了.NET类库开发的一套完整的设计准则,不仅帮助开发者提高代码质量,还通过提供统一的编程模型来...

    c# 下载的一些面试题

    面试官可能询问如何避免内存泄漏,或者关于Finalize和Dispose方法的区别。 8. **LINQ(Language Integrated Query)**:C#的查询语言特性,用于数据库查询和对象序列操作。面试中可能要求使用LINQ进行数据筛选、...

    MSDN类库开发人员设计指南

    - **实现Finalize和Dispose以清理非托管资源**:当类或结构使用了非托管资源时,应实现`Finalize`和`Dispose`方法来确保这些资源被正确释放。 - **实现Equals方法**:`Equals`方法用于比较两个对象是否相等。在.NET ...

    C#基础:Dispose()、Close()、Finalize()的区别详解

    本文将深入探讨三个关键的方法:`Dispose()`、`Close()`和`Finalize()`,以及它们在处理对象销毁时的区别。 首先,让我们从.NET内存管理和垃圾回收(Garbage Collection, GC)的基本概念开始。在.NET中,内存管理由...

    c# dispose用法演示

    在实际开发中,`Dispose`方法经常与`Finalize`方法一起使用,以实现终结器(Finalizer)。终结器是类的一个特殊方法,由垃圾回收器在对象即将被销毁时调用,用于清理非托管资源。但是,由于终结器的调用时间不确定,...

    C++编程人员容易犯的10个C_错误

    这些错误和最佳实践是C++程序员在学习C#时需要注意的关键点,理解并正确使用垃圾回收、Finalize、Dispose和using语句对于编写高效、无内存问题的C#代码至关重要。在C#编程中,良好的资源管理习惯可以帮助避免性能...

    2022年代码最优化.NET中的内存管理C语言教程.docx

    为了确保资源在未被`Dispose`方法清理时也能正确释放,推荐在类中同时实现`Finalize`和`Dispose`方法。这样,即使`Dispose`没有被调用,垃圾收集器在执行`Finalize`时也会尝试释放资源,避免资源泄漏。`Dispose`方法...

    C#中的垃圾回收机制

    在基类BaseResource中,析构函数自动生成Finalize方法和对基类的Finalize方法的调用。在Finalize方法中,开发者可以释放非托管资源,并将已释放的标记设置为true。 C#中的垃圾回收机制可以自动管理内存,但开发者...

    asp.net sqlconnection con.close和con.dispose区别

    在处理数据库连接时,理解`Close()`和`Dispose()`方法的区别至关重要,因为这直接影响到程序的性能和资源管理。 首先,`Close()`方法的作用是关闭数据库连接,但它并不立即释放连接资源。相反,它将连接返回到ADO...

    C#多线程开发多个实例

    //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦 if (disposing) { GC.SuppressFinalize(this); } } } static void Main(string[] args) { //tmpObj1...

    .net面试题

    - **Close方法**:某些类同时提供了Close方法和Dispose方法。例如,FileStream类同时提供了这两个方法。Close方法实际上是Dispose方法的一个别名,它们的功能是相同的,即释放资源并关闭流。 #### 三、代码示例解析...

    在.NET Compact Framework中管理内存和资源

    - 示例代码片段展示了如何实现 `Dispose` 方法和析构器: ```csharp public class DisposePatternSample : IDisposable { private bool _disposed = false; public void Dispose() { Dispose(true); GC....

    资源文件释放_资源文件释放_

    在.NET编程环境中,资源文件...通过使用using语句、手动调用Dispose、理解和运用 Dispose 模式,以及合理利用资源池和智能指针,开发者能够有效地管理.NET程序中的资源文件,避免内存泄漏,提升应用的性能和稳定性。

    Visual Basic 中面向对象的编程

    为了释放非托管资源,如文件句柄或数据库连接,可以实现`Dispose`和`Finalize`方法。`Dispose`是用于立即释放资源,而`Finalize`是在对象被垃圾回收前调用,确保资源得以清理。 #### 2.6 构造函数和析构函数 构造...

Global site tag (gtag.js) - Google Analytics