如何编写代码以释放Destructor / Dispose方法中的托管/非托管资源

时间:2019-03-12 04:16:14

标签: c# destructor finalizer disposable

我是C#的新手,实际上我了解了析构函数和dipose方法的概念以及它们之间的区别,以及如何从这些操作中实际调用/阻止GC。但是,当我尝试了解这些方法中实际释放的内容时,我陷入了困境。

第一件事是,仅定义一个空的析构函数或控制台输出不会对释放未使用的内存有任何帮助。因此,我应该在析构函数内部编写什么,或者将类的字段设置为null还是什么?我知道GC将处理托管资源,如果遇到非托管资源怎么办

我通常在所有论坛和搜索中都能找到这个熟悉的示例,但是没有一个人清楚应该写些什么来释放未使用的内存

class Test : IDisposable
{
    private bool isDisposed = false;

    ~Test()
    {
       Dispose(false);
    }

    protected void Dispose(bool disposing)
    {
       if (disposing)
       {
          // Code to dispose the managed resources of the class
       }
       // Code to dispose the un-managed resources of the class

       isDisposed = true;
    }

    public void Dispose()
    {
       Dispose(true);
       GC.SuppressFinalize(this);
    }
}

我理解了该示例,但是在dispose方法( //处置类的托管资源的代码中,注释行中应该包含什么代码&   //处理该类的非托管资源的代码)。有人可以给我提供示例示例来解决我的疑问

1 个答案:

答案 0 :(得分:2)

  

我理解该示例,但注释中应包含什么代码   线

看起来,每个托管资源(即由.Net分配的在后台不使用任何非托管资源的资源)都可以使用GC释放,并且根本不需要处置。所有处置工作都是unmanaged memory,这些对象是通过Win32 API调用或任何非托管外部代码分配的。

现在要回答您的问题,答案是您必须将代码放到Dispose内释放那些非托管对象,根据您使用的外部代码或API,应该有一种方法(例如方法)释放内存。

可能还有另一个问题,现在只应处理非托管代码,为什么要有一个部分来配置托管资源?
这是因为该托管资源内部依赖于非托管资源,通过调用Dispose释放内存,托管代码为您处理了释放代码(包装在Dispose中)。例如FileStream