Есть ли разница между этими двумя способами использования foreach? - PullRequest
2 голосов
/ 29 апреля 2019

Есть ли разница между двумя фрагментами кода, показанными ниже?

  1. Свойство загружено в переменную перед предложением foreach.

    var someCollection = someClass.Collection;
    foreach (var elem in someCollection)
    {
        // Do something
    }
    
  2. Свойство, доступное внутри строки в предложении foreach.

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

Второй вариант менее оптимизирован, и если да, то почему?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2019

Нет никакой разницы между двумя подходами, с точки зрения оптимизации или производительности.Чтобы доказать это, я создал краткий пример, похожий на ваш:

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-компилятора версия 2.9.0, оба метода A и B в результате получается тот же самый промежуточный код, как показано ниже ( ссылка ).

Тело метода A и B

List<string>.Enumerator enumerator = SomeClass.Collection.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        string current = enumerator.Current;
    }
}
finally
{
    ((IDisposable)enumerator).Dispose();
}
3 голосов
/ 29 апреля 2019

Нет разницы в производительности или оптимизации. Единственное отличие состоит в том, что в вашем коде есть еще одна переменная, которая содержит ссылку (адрес, «указатель») на вашу коллекцию.

...