在代码审查期间,我被告知要确保为我使用的所有查询对象(LinqToEntities)执行dispose方法。
这是一次如此大的内存泄漏吗?我怎样才能更优雅地解决这个问题,现在我完成后我没有做任何处理?
我的代码如下:
var query = from x in listOfEntities where some_condition select x;
答案 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
合同的重要部分是它带来的约定。无论内部运作如何,你都坚持合同,因为内部运作是可以改变的,合同是不可改变的。虽然我不是盲目地应用规则,但我总是尝试来处理我正在使用的项目。