Об отложенном исполнении IEnumerable

В следующем коде я понимаю, что вторая инициализация печатает одну "снаружи" и три "внутри". Но почему первый вообще не печатает, я ожидаю, что он напечатает один "снаружи".

        DeferExecution a = new DeferExecution(); // prints nothing 
        DeferExecution b = new DeferExecution(null); // print one "outside" and three "inside".

 class DeferExecution
{
    public IEnumerable<string> Input;

    public DeferExecution()
    {
        Input = GetIEnumerable();
    }

    public DeferExecution(string intput)
    {
        Input = GetIEnumerable().ToArray();
    }

    public IEnumerable<string> GetIEnumerable()
    {
        Console.WriteLine("outside");  
        var strings = new string[] {"a", "b", "c"};
        foreach (var s in strings)
        {
            Console.WriteLine("inside");  
            yield return s;
        }
    }
}

1 ответ

Решение

Возвращаемое перечисляемое реализовано как блок итератора (т. Е. Метод, который использует yield).

Код внутри блоков итератора фактически не выполняется до тех пор, пока они не будут перечислены впервые, поэтому вы ничего не увидите, если ничего не сделаете с IEnumerable,

Другие вопросы по тегам