如下所示的两个代码段之间有区别吗?


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

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

foreach子句中内联访问的属性。

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



第二个变体的优化程度是否较低?如果可以,为什么?

最佳答案

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

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)。

AB的方法主体

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

10-06 00:28