是在这个foreach循环中创建的垃圾
本文关键字:创建 循环 foreach | 更新日期: 2023-09-27 17:58:53
我在foreach
循环中遇到了一个方法,可以通过转换为列表来更改列表,如下所示:
foreach (var item in myList.ToList())
{
//add or remove items from myList
}
(如果您试图直接修改myList
,则会引发错误,因为枚举器基本上将其锁定)
这之所以有效,是因为它不是正在修改的原始myList
。我的问题是,当循环结束时(即从ToList
方法返回的List
),这种方法会创建garbage
吗?对于小循环,是否最好使用for loop
来避免创建垃圾?
第二个列表将是垃圾,在构建第二个名单中使用的枚举器将有垃圾,并添加foreach
将生成的枚举器,无论是否使用第二个清单,都会有垃圾。
你应该换成for
吗?也许,如果您可以指出这一代码区域是真正的性能瓶颈。否则,请编写代码以获得简单性和可维护性。
是。CCD_ 10将创建另一个需要进行垃圾收集的列表。
这是一项有趣的技术,我将在未来牢记!(我简直不敢相信我从来没有想过!)
不管怎样,是的,你正在构建的列表并没有神奇地自行分配。这种技术可能存在的性能问题有:
- 增加了内存使用量(构建一个独立于
IEnumerable
的List
)。可能没什么大不了的,除非你经常这样做,或者IEnumerable
非常大 - 降低了速度,因为它必须同时通过
IEnumerable
才能构建List
- 此外,如果枚举
IEnumerable
有副作用,它们都将由该过程触发
除非这实际上是在一个内部循环中,或者您正在处理非常大的数据集,否则您可能可以毫无问题地完成这项工作。
ToList()
方法会创建"垃圾"。我只是索引。
for (int i = MyList.Count - 1; 0 <= i; --i)
{
var item = MyList[i];
//add or remove items from myList
}
它是不确定的。但是从调用CCD_ 18创建的引用最终将是GCd。
我不会太担心它,因为它最多只包含引用或小值类型。