For Each循环枚举器表达式和内存消耗

时间:2011-08-15 17:11:25

标签: vb.net

根据VB.NET第10.9.3节的语言规范guide

  

将for each循环中的枚举器表达式复制到   存储器中。

如果我有一个10000个对象的列表,那么列表将在内存中两次以下代码?

dim myList as new list(of bobs)
'put 10000 bobs in my list
for each x In myList
'do something 
next

如果我从linqQuery或其他一些此类查询生成列表,那么在每个循环语句中生成该列表是有意义的,因此例如在内存中没有列表两次。

for each x in myList.where(function(x) x.name = Y)
'do something
next

如果LINQ查询在每个循环中都不可读,我是否放弃了可读性并将其放在for each循环声明行中?

我应该在自己的变量中声明列表,只是咬住子弹并让列表在内存中存在两次吗?

1 个答案:

答案 0 :(得分:3)

  

该列表将在内存中两次代码

不,它不会。在你的情况下,规范是在这里讨论变量“x” - 而不是整个集合。请记住,枚举器(任何IEnumerable<T>或类似的)甚至不一定在内存中有项目。例如,当通过C#中的迭代器创建时,您可以拥有在枚举它们时生成的“集合”。即使语言想要这样做,也没有可以复制的对象(必然)的“列表”。

  

对于每个循环,linq查询是否不可读

在许多情况下,我更喜欢以这种方式过滤。如果你想让它更清晰,你也可以轻松地将它移到循环之外:

Dim filteredCollection = myList.Where(Function(x) x.name = Y)
For Each x in filteredCollection

如果您发现它更具可读性,那么这样做没有任何不利之处。