繁体   English   中英

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

[英]How to write code to release manged/unmanaged resources in Destructor/Dispose method

对于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方法内的注释行中应该包含什么代码( //用于处理该类的托管资源的 代码//用于处理 该类 的非托管资源的代码 )。 有人可以给我提供示例示例来解决我的疑问吗

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM