C# 4.0 如果我没有';不使用处置方法?
在代码审查期间,我被告知要确保对我使用的所有查询对象(LinqToEntities)执行dispose方法 这是一个如此大的内存泄漏吗?我怎样才能更优雅地解决这个问题,现在我完成后不做任何处理 我的代码如下:C# 4.0 如果我没有';不使用处置方法?,c#-4.0,memory-leaks,linq-to-entities,C# 4.0,Memory Leaks,Linq To Entities,在代码审查期间,我被告知要确保对我使用的所有查询对象(LinqToEntities)执行dispose方法 这是一个如此大的内存泄漏吗?我怎样才能更优雅地解决这个问题,现在我完成后不做任何处理 我的代码如下: var query = from x in listOfEntities where some_condition select x; 我认为这个查询不会导致内存泄漏。可能导致问题的不是查询。它可能是数据上下文。由于数据上下文实现了IDisposable,您可以执行以下操作: using
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;
}
使用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();
}
编辑:(根据@Fredrik Mörk的评论)。上面的代码只是为了向您展示
使用
语句对DataContext
的用法。要在using块外使用query
对象,可以在using
块外定义它,并调用ToList
或类似方法,以便执行查询。以后你可以用它。否则,由于延迟执行,当前代码块将失败 我认为这个查询不会导致内存泄漏。可能导致问题的不是查询。它可能是数据上下文。由于数据上下文实现了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();
}
编辑:(根据@Fredrik Mörk的评论)。上面的代码只是为了向您展示
使用
语句对DataContext
的用法。要在using块外使用query
对象,可以在using
块外定义它,并调用ToList
或类似方法,以便执行查询。以后你可以用它。否则,由于延迟执行,当前代码块将失败 并非特定于这种情况,但缺少调用Dispose
是否会导致泄漏取决于一次性对象的内部工作。在一次性物品的框架中,有一些例子对dispose几乎不起作用或什么也不起作用。有些实现也只处理托管对象,最终由GC处理(因此在本例中,您只会丢失对对象的确定性处理,而不一定会导致任何内存泄漏)
IDisposable
合同的重要部分是它带来的惯例。无论内部工作方式如何,您都要遵守合同,因为内部工作方式是可以更改的,合同是不可以更改的。虽然我不赞成盲目地应用规则,但我倾向于总是尝试处理我正在使用的项目。并非针对这种情况,但缺少调用dispose
是否会导致泄漏取决于一次性对象的内部工作。在一次性物品的框架中,有一些例子对dispose几乎不起作用或什么也不起作用。有些实现也只处理托管对象,最终由GC处理(因此在本例中,您只会丢失对对象的确定性处理,而不一定会导致任何内存泄漏)
IDisposable
合同的重要部分是它带来的惯例。无论内部工作方式如何,您都要遵守合同,因为内部工作方式是可以更改的,合同是不可以更改的。虽然我不赞成盲目地应用规则,但我倾向于总是尝试处理我正在使用的项。我没有太多地使用实体框架,因此我在这里可能完全错了,但这不会在执行查询之前处理上下文(导致查询失败),因为LINQ的延迟执行吗?@FredrikMörk我相信会的,由于查询将推迟到迭代,但我认为这只是一个稀疏的示例,用using
或try
来传达对项目的处理,它不会试图解释查询的后续进一步使用。@FredrikMörk,您必须在外部定义查询才能使用它,并调用一些方法,如ToList
,以执行一次查询。以后你可以用它。我的观点是展示IDisposable的用法。@Habib:我知道需要调用ToList
(或ToArray
),这就是我发表评论的原因。我想你应该在你的回答中指出这一点,因为现在的代码将失败。@FredrikMörk,谢谢你的建议,我编辑了我的回答以反映这一点。感谢againI没有在实体框架上做太多的工作,所以我在这里可能完全错了,但这不会在执行查询之前处理上下文(导致查询失败),因为LINQ的延迟执行?@FredrikMörk我相信会的,因为查询将延迟到迭代,但我认为这只是一个稀疏示例的例子,用using
或try
来表达对项目的处理,它并不试图解释查询的后续用法。@FredrikMörk,您必须在外部定义查询才能使用它,并调用ToList
之类的方法来执行一次查询。以后你可以用它。我的观点是展示IDisposable的用法。@Habib:我知道需要调用ToList
(或ToArray
),这就是我发表评论的原因。我想你应该在你的回答中指出这一点,因为现在的代码将失败。@FredrikMörk,谢谢你的建议,我编辑了我的回答以反映这一点。再次感谢