如果我不使用dispose方法,linq是否会查询内存泄漏?

时间:2012-10-15 09:15:02

标签: c#-4.0 memory-leaks linq-to-entities

在代码审查期间,我被告知要确保为我使用的所有查询对象(LinqToEntities)执行dispose方法。

这是一次如此大的内存泄漏吗?我怎样才能更优雅地解决这个问题,现在我完成后我没有做任何处理?

我的代码如下:

var query = from x in listOfEntities where some_condition select x;

2 个答案:

答案 0 :(得分:3)

我认为这个查询不会导致内存泄漏。它不是可能导致问题的查询。它可能是数据上下文。由于数据上下文实现了IDisposable,您可以这样做:

using (var ctx = new yourDataContext())
{
   var query = from x in ctx.listOfEntities where some_condition select x;
}

使用using子句,它将确保在代码退出using语句后关闭与数据库的连接。它类似于try / finally块。

var ctx = new yourDataContext();
try
{
    var query = from x in ctx.listOfEntities where some_condition select x;
}
finally
{
   if(ctx != null)
        ctx.Dispose();
}

编辑:(根据@FredrikMörk的评论)。上面的代码只是为了向您展示using语句相对于DataContext的用法。要在using块之外使用query对象,您可以在using块之外定义它并调用ToList或类似方法,以便执行查询。稍后你可以使用它。否则,由于延迟执行,当前代码块将失败。

答案 1 :(得分:1)

不是特定于这种情况,但缺少调用Dispose是否会导致泄漏取决于一次性对象的内部工作方式。在一次性物品的框架中有一些例子,它们在处理时很少或根本没有。某些实现也只处理托管对象,最终将由GC处理(因此在这种情况下,您只会丢失确定性对象的处理,不一定会导致任何内存泄漏)。

IDisposable合同的重要部分是它带来的约定。无论内部运作如何,你都坚持合同,因为内部运作是可以改变的,合同是不可改变的。虽然我不是盲目地应用规则,但我总是尝试来处理我正在使用的项目。