静态分析工具不断告诉我,我的C#代码中存在资源泄漏。

这是一个例子:

StringReader reader = new StringReader(...);

// do something with reader

...

} // static analysis tool cries that I've leaked **reader**

我的工具正确吗?如果是这样,为什么?

编辑(回复评论)-我的静态分析工具说我有很多资源泄漏。我从forum知道某些Java AWT对象需要显式释放,否则会发生泄漏。是否存在需要显式释放的C#对象?

最佳答案

是的,您的代码泄漏严重。应该是这样的:

using (StringReader reader = new StringReader(...))
{

}

每个实现IDisposable的类都需要包装在using block中,以确保始终调用Dispose方法。

更新:

详细说明:.NET中的IDisposable接口(interface)定义了Dispose方法。实现此接口(interface)的类(例如文件流,数据库连接,读取器等)可能包含指向非托管资源的指针,并且确保释放那些非托管资源/句柄的唯一方法是调用Dispose方法。因此,在.NET中要确保即使抛出异常也要调用某些代码,是使用try/finally语句:
var myRes = new MyResource(); // where MyResource implements IDisposable
try
{
    myRes.DoSomething(); // this might throw an exception
}
finally
{
    if (myRes != null)
    {
        ((IDisposable)myRes).Dispose();
    }
}

编写C#代码的人们很快意识到,每次处理一次性资源时编写此代码都是PITA。因此,他们引入了using语句:
using (var myRes = new MyResource())
{
    myRes.DoSomething(); // this might throw an exception
}

这有点短。

关于c# - 垃圾收集器不清理哪些对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4261041/

10-11 02:55