我从阅读MSDN文档中了解到,IDisposable接口的"主要"用途是清理非托管资源.
对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.
例如:
public class MyCollection : IDisposable
{
private List<String> _theList = new List<String>();
private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();
// Die, clear it up! (free unmanaged resources)
public void Dispose()
{
_theList.clear();
_theDict.clear();
_theList = null;
_theDict = null;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
读完线程后SqlCommand.Dispose足够吗?和关闭和处置WCF服务,我琢磨类,如SqlConnection的或几类从Stream类继承它的问题,如果我收处置,而不是关闭的一个?
我有一个类应该在处理或最终时删除一些文件.在终结器中我不能使用其他对象,因为它们可能已经被垃圾收集了.
我是否遗漏了关于终结器的一些观点并且可以使用弦乐?
UPD:类似的东西:
public class TempFileStream : FileStream
{
private string _filename;
public TempFileStream(string filename)
:base(filename, FileMode.Open, FileAccess.Read, FileShare.Read)
{
_filename = filename;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (_filename == null) return;
try
{
File.Delete(_filename); // <-- oops! _filename could be gc-ed already
_filename = null;
}
catch (Exception e)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud) 编辑:我的问题是没有得到我正在寻找的主要答案.我不清楚.我真的很想知道两件事:
Dispose()导致内存泄漏?我的印象是,如果Dispose()未在IDisposable对象上调用内存泄漏.
根据这个帖子的讨论,我的看法不正确; 如果Dispose()未调用,则不会发生内存泄漏.
那么为什么打扰Dispose()呢?是否只是立即释放资源,而不是以后的某个时间?如果你有一个大型程序并且从不调用Dispose()任何IDisposable对象,那么最糟糕的事情是什么?