这两种使用foreach的方式之间有区别吗?

时间:2019-04-29 09:53:22

标签: c# optimization foreach properties

下面显示的两个代码段之间是否有区别?

  1. foreach子句之前将属性加载到变量中。

    var someCollection = someClass.Collection;
    foreach (var elem in someCollection)
    {
        // Do something
    }
    
  2. foreach子句中内联访问属性。

    foreach (var elem in someClass.Collection)
    {
        // Do something
    }
    

第二个变体的优化程度是否较低?为什么?

2 个答案:

答案 0 :(得分:4)

在优化或性能方面,这两种方法之间没有区别。为了证明这一点,我创建了一个类似于您的简短示例:

public class C {
    public void A() {
        foreach (var item in SomeClass.Collection) {}
    }

    public void B() {
        var someCollection = SomeClass.Collection;
        foreach (var item in someCollection) {}
    }   
}

public static class SomeClass {
    public static List<string> Collection { get; set; }
}

使用Roslyn .NET compiler版本2.9.0进行编译时,两种方法AB会产生如下所示的完全相同的中间代码( reference < / strong>)。

AB

的方法主体
List<string>.Enumerator enumerator = SomeClass.Collection.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        string current = enumerator.Current;
    }
}
finally
{
    ((IDisposable)enumerator).Dispose();
}

答案 1 :(得分:3)

性能或优化上没有差异。唯一的区别是您的代码中还有一个变量,其中包含对集合的引用(地址,“指针”)。