【发布时间】:2013-09-04 08:23:40
【问题描述】:
我了解 C# 中 foreach 循环如何工作的基础知识 (How do foreach loops work in C#)
我想知道是否使用 foreach 分配的内存可能会导致垃圾回收? (适用于所有内置系统类型)。
例如在System.Collections.Generic.List<T>类上使用Reflector,下面是GetEnumerator的实现:
public Enumerator<T> GetEnumerator()
{
return new Enumerator<T>((List<T>) this);
}
每次使用都会分配一个新的枚举器(以及更多垃圾)。
所有类型都这样做吗?如果是这样,为什么? (不能重复使用单个 Enumerator 吗?)
【问题讨论】:
-
a) 这是一个实现细节。那些无关紧要。 b) GC 存在。
-
我猜,单枚举器的主要问题是线程安全。
-
这不限于
foreach()。拥有 GC 的整个想法是小的、短寿命的对象非常便宜。我们一直在“浪费”它们,例如text = text.ToLower();。别担心。大多数重复使用方案的成本更高。 -
任何到达此页面的人都可能有充分的理由来到这里。有时候,每次分配都很重要,如果可能的话应该避免。 (“别担心”可能在 99% 的情况下都是正确的,但当它很重要时,它可能很重要。)
-
许多使用我最喜欢的语言 C# 的人的反性能心态,以及他们的不断抨击,一个非常大的群体,仅仅暗示有人关心低级别的性能问题(正如您在上面的第一条评论中看到的那样),过去已经有害到足以考虑这对于我们这些关心的人来说是否是正确的语言。这种心态导致 C# / .NET 十多年来一直不专注于精简和卑鄙。我很高兴现在已经用 netcore 取代了心态,我只是希望它能更快地通过队伍。