Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如果我没有';不使用处置方法?_C# 4.0_Memory Leaks_Linq To Entities - Fatal编程技术网

C# 4.0 如果我没有';不使用处置方法?

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

在代码审查期间,我被告知要确保对我使用的所有查询对象(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;
}
使用
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,谢谢你的建议,我编辑了我的回答以反映这一点。再次感谢