0

我是 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 方法内的注释行中(// 用于处理类的托管资源的代码 & // 用于处理类的非托管资源的代码)。有人可以给我一个可以解决我疑问的示例吗

4

1 回答 1

2

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

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

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

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

于 2019-03-12T04:40:15.600 回答