【发布时间】:2011-05-17 08:08:29
【问题描述】:
由于我对linq比较陌生,所以我想问一下我对以下示例的理解是否正确。
假设我有大量的动物名称(10 万条记录),我想归档它们并以非常耗时的方法(2 周)处理过滤后的项目。 RunWithLinq() 和 RunWithoutLinq() 方法完全一样。
是不是使用第一种方法,原始(大)集合在离开该方法后将留在内存中,并且不会被GC 触及,而使用linq-less 方法,该集合将被@删除987654324@?
我将不胜感激。
class AnimalProcessor
{
private IEnumerable<string> animalsToProcess;
internal AnimalProcessor(IEnumerable<string> animalsToProcess)
{
this.animalsToProcess = animalsToProcess;
}
internal void Start()
{
//do sth for 2 weeks with the collection
}
}
class Program
{
static void RunWithLinq()
{
var animals = new string[] { "cow", "rabbit", "newt", "ram" };
var filtered = from animal in animals
where animal.StartsWith("ra")
select animal;
AnimalProcessor ap = new AnimalProcessor(filtered);
ap.Start();
}
static void RunWithoutLinq()
{
var animals = new string[] { "cow", "rabbit", "newt", "ram" };
var filtered = new List<string>();
foreach (string animal in animals)
if(animal.StartsWith("ra")) filtered.Add(animal);
AnimalProcessor ap = new AnimalProcessor(filtered);
ap.Start();
}
}
【问题讨论】:
-
最初是什么让您产生这种印象?
-
@Jay 当我使用调试器时,它直到使用结果才进入查询,这是我之前不知道的/。
-
animals会在non-linq方式中被收集吗?可能(可能是天真的)理解是,局部变量在函数的右括号之后超出范围(并且可以被收集),即在 ap.Start() 两周后返回之后(除非它真的异步运行,至案例将此评论视为空)。 =) -
@Jens,一旦不再使用对象,即使它仍在范围内,也可以进行收集。范围适用于源代码,但 GC 规则适用于实际使用。更多信息请参见我的回答。
标签: c# linq memory-management