在代码审查期间,我被告知要确保对我使用的所有查询对象(LinqToEntities)执行 dispose 方法。
这是这么大的内存泄漏吗?我怎样才能更优雅地解决这个问题,现在我完成后不做任何处置?
我的代码如下:
var query = from x in listOfEntities where some_condition select x;
在代码审查期间,我被告知要确保对我使用的所有查询对象(LinqToEntities)执行 dispose 方法。
这是这么大的内存泄漏吗?我怎样才能更优雅地解决这个问题,现在我完成后不做任何处置?
我的代码如下:
var query = from x in listOfEntities where some_condition select x;
我认为这个查询不会导致内存泄漏。它不是可能导致问题的查询。它可能是数据上下文。由于数据上下文实现了 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
或类似方法,以便执行查询。以后就可以使用了。否则,由于延迟执行,当前代码块将失败。
不特定于这种情况,但是缺少调用是否Dispose
会导致泄漏取决于一次性对象的内部工作原理。在一次性物品的框架中有一些例子,这些物品在处置时很少或不做任何事情。一些实现也只处理托管对象,无论如何最终都会由 GC 处理(因此在这种情况下,您只会丢失对象的确定性处理,不一定会导致任何内存泄漏)。
合同的重要部分IDisposable
是它带来的约定。无论内部运作如何,您都遵守合同,因为内部运作是可以改变的,合同是不可改变的。虽然我不是盲目地应用规则,但我倾向于总是尝试处理我正在使用的项目。