首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写代码以释放Destructor/Dispose方法中的管理/非托管资源

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

Stack Overflow用户
提问于 2019-03-12 04:16:13
回答 1查看 339关注 0票数 0

我是C#的新手,我实际上理解析构函数和dipose方法的概念以及它们之间的区别,以及如何从这些操作中实际调用/阻止GC。但是,当我试图理解我们在这些方法中实际发布了什么时,我就被困住了。

第一件事是,仅仅定义一个空析构函数或控制台输出对释放未使用的内存没有任何好处。那么,我应该在析构函数中写什么,或者使类的字段为空还是什么?我知道GC会处理托管资源,那么如果我面对的是非托管资源呢?

我通常会在论坛和搜索中找到这个熟悉的例子,但是没有一个能清楚地说明应该写什么来释放未使用的内存。

代码语言:javascript
复制
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方法中的注释行中应该包含哪些代码( // code来释放类的托管资源& // Code来释放类的非托管资源)。有人能给我一个例子来解决我的疑问吗?

EN

回答 1

Stack Overflow用户

发布于 2019-03-12 04:40:15

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

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

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

可能还有另一个问题,既然应该只释放非托管代码,为什么会有一个节来处理托管资源?

这是因为托管资源在内部依赖于非托管资源,通过调用Dispose释放内存,托管代码为您处理发布代码(包装在Dispose中)。这方面的例子可以是FileStream

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55114072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档