我是C#的新手,我实际上理解析构函数和dipose方法的概念以及它们之间的区别,以及如何从这些操作中实际调用/阻止GC。但是,当我试图理解我们在这些方法中实际发布了什么时,我就被困住了。
第一件事是,仅仅定义一个空析构函数或控制台输出对释放未使用的内存没有任何好处。那么,我应该在析构函数中写什么,或者使类的字段为空还是什么?我知道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方法中的注释行中应该包含哪些代码( // code来释放类的托管资源& // Code来释放类的非托管资源)。有人能给我一个例子来解决我的疑问吗?
发布于 2019-03-12 04:40:15
我理解这个例子,但是注释行中应该包含哪些代码?
看,每个托管资源(即由.Net分配的、在幕后不使用非托管资源的资源)都是使用GC释放的,根本不需要处理。所有的处理都是关于unmanaged memory的,那些是通过Win32 API调用或任何非托管外部代码分配的。
现在要回答您的问题,答案是您必须将代码放在Dispose中释放那些非托管对象,根据您正在使用的外部代码或API,应该有一种方法(例如方法)来释放内存。
可能还有另一个问题,既然应该只释放非托管代码,为什么会有一个节来处理托管资源?
这是因为托管资源在内部依赖于非托管资源,通过调用Dispose释放内存,托管代码为您处理发布代码(包装在Dispose中)。这方面的例子可以是FileStream
https://stackoverflow.com/questions/55114072
复制相似问题