C# 枚举字典值与字典本身

C# 枚举字典值与字典本身,c#,.net,dictionary,asp.net-core,.net-core,C#,.net,Dictionary,Asp.net Core,.net Core,我在GitHub上探索ASP.NET核心的来源,看看ASP.NET团队使用了什么样的技巧来加速框架。我看到了一些吸引我的东西。在的源代码中,在Dispose实现中,他们枚举了一个字典,并添加了一条注释以指示性能技巧: private readonly Dictionary<IService, object> _resolvedServices = new Dictionary<IService, object>(); // Code removed for brevit

我在GitHub上探索ASP.NET核心的来源,看看ASP.NET团队使用了什么样的技巧来加速框架。我看到了一些吸引我的东西。在的源代码中,在Dispose实现中,他们枚举了一个字典,并添加了一条注释以指示性能技巧:

private readonly Dictionary<IService, object> _resolvedServices = new Dictionary<IService, object>();

// Code removed for brevity

public void Dispose()    
{        
    // Code removed for brevity

    // PERF: We've enumerating the dictionary so that we don't allocate to enumerate.
    // .Values allocates a KeyCollection on the heap, enumerating the dictionary allocates
    // a struct enumerator
    foreach (var entry in _resolvedServices)
    {
        (entry.Value as IDisposable)?.Dispose();
    }

    _resolvedServices.Clear();        
}

它对性能有影响吗?或者是因为分配内存会消耗更多的内存?

你说得对,这是关于内存消耗的。这一区别实际上在注释中得到了很好的描述:访问堆上的
字典
属性,这是一个类(引用类型)


foreach
“遍历字典本身会产生一个调用,该调用返回一个。这是一个
struct
,将在堆栈上而不是在堆上进行分配。

我似乎错过了这里详细描述的堆和堆栈的概念,顺便说一句,谢谢。
foreach (var entry in _resolvedServices.Values)
{
    (entry as IDisposable)?.Dispose();
}