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

问题描述 投票:0回答:1

我是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方法中的注释行中添加什么代码(//代码来处理类的托管资源和//代码来处理类的未管理资源)。有人可以给我一个示例来解决我的疑问

c# destructor finalizer disposable
1个回答
2
投票

我理解这个例子,但是注释行中应该包含哪些代码

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.