是在这个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循环中创建的垃圾

第二个列表将是垃圾,在构建第二个名单中使用的枚举器将有垃圾,并添加foreach将生成的枚举器,无论是否使用第二个清单,都会有垃圾。

你应该换成for吗?也许,如果您可以指出这一代码区域是真正的性能瓶颈。否则,请编写代码以获得简单性和可维护性。

是。CCD_ 10将创建另一个需要进行垃圾收集的列表。

这是一项有趣的技术,我将在未来牢记!(我简直不敢相信我从来没有想过!)

不管怎样,是的,你正在构建的列表并没有神奇地自行分配。这种技术可能存在的性能问题有:

  1. 增加了内存使用量(构建一个独立于IEnumerableList)。可能没什么大不了的,除非你经常这样做,或者IEnumerable非常大
  2. 降低了速度,因为它必须同时通过IEnumerable才能构建List
  3. 此外,如果枚举IEnumerable有副作用,它们都将由该过程触发

除非这实际上是在一个内部循环中,或者您正在处理非常大的数据集,否则您可能可以毫无问题地完成这项工作。

是的,ToList()方法会创建"垃圾"。我只是索引。
for (int i = MyList.Count - 1; 0 <= i; --i)
{
    var item = MyList[i];
    //add or remove items from myList
}

它是不确定的。但是从调用CCD_ 18创建的引用最终将是GCd。

我不会太担心它,因为它最多只包含引用或小值类型。