0

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

这是这么大的内存泄漏吗?我怎样才能更优雅地解决这个问题,现在我完成后不做任何处置?

我的代码如下:

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

2 回答 2

3

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

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

withusing子句将确保在代码退出 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();
}

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

于 2012-10-15T09:17:35.657 回答
1

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

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

于 2012-10-15T09:25:17.360 回答