相关疑难解决方法(0)

正确使用IDisposable接口

我从阅读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在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?

.net c# garbage-collection idisposable

1586
推荐指数
12
解决办法
31万
查看次数

关闭和处理 - 要打电话?

读完线程后SqlCommand.Dispose足够吗?关闭和处置WCF服务,我琢磨类,如SqlConnection的或几类从Stream类继承它的问题,如果我收处置,而不是关闭的一个?

.net

153
推荐指数
5
解决办法
11万
查看次数

我可以在终结器方法中使用哪些对象?

我有一个类应该在处理或最终时删除一些文件.在终结器中我不能使用其他对象,因为它们可能已经被垃圾收集了.

我是否遗漏了关于终结器的一些观点并且可以使用弦乐?

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)

.net c#

13
推荐指数
1
解决办法
716
查看次数

为什么要调用Dispose()?内存泄漏不会发生?

编辑:我的问题是没有得到我正在寻找的主要答案.我不清楚.我真的很想知道两件事:

  1. 不能调用Dispose()导致内存泄漏?
  2. 如果你有一个大型程序并且从不在任何IDisposable对象上调用Dispose(),那么最糟糕的事情是什么?

我的印象是,如果Dispose()未在IDisposable对象上调用内存泄漏.

根据这个帖子的讨论,我的看法不正确; 如果Dispose()未调用,则不会发生内存泄漏.

那么为什么打扰Dispose()呢?是否只是立即释放资源,而不是以后的某个时间?如果你有一个大型程序并且从不调用Dispose()任何IDisposable对象,那么最糟糕的事情是什么?

c# memory-leaks memory-management idisposable

12
推荐指数
3
解决办法
6779
查看次数

什么时候处理方法不被调用?

前几天我正在阅读这篇文章,并想知道为什么有一个Finalizer和Dispose方法.我在这里读到为什么你可能想要将Dispose添加到Finalizer.我的好奇心是,什么时候会调用终结器本身的Dispose方法呢?是否有代码示例,或者它是基于软件运行的系统上发生的事情?如果是这样,可能会发生GC没有运行Dispose方法的情况.

c# garbage-collection dispose idisposable finalizer

7
推荐指数
2
解决办法
4966
查看次数