Linq и пошаговая отладка

Рейтинг: 0Ответов: 1Опубликовано: 17.02.2015

Господа, подскажите, пожалуйста, как понимать. Есть массив строк. К данному массиву я обращаюсь через LINQ запрос. Ранее я предполагал, что когда выполняется запрос, то формируется определенный результат, который сохраняется в определенном объекте (своего внутреннего типа), и этот объект реализует IEnumerable. Ну дальше foreach уже работает с этим объектом.

Однако я выполнил программу в пошаговом режиме и потерялся ))). В информации об отладке при первом же обращении к переменной запроса v в разделе "Представление результатов" сразу же появляется готовый ответ (см. рисунок), как я и ожидал. НО я предполагал, что на этом и конец. Однако при дальнейшей пошаговой отладке компилятор почему-то лезет в код запроса и как бы пошагово получает тот результат, который уже мне был показан в разделе "Представление результатов".

Зачем он это делает, если результат уже известен?

Сам код. Понимаю, что запрос корявый, но это в учебных целях.

class Program
    {
        static void Main(string[] args)
        {
            string[] s = { "Gleb", "Pavel", "Guzel", "Sergey", "Mainsis", "Berkak" };
            var v = from str in s
                    where str.Length > 4
                    select str
                        into Temp
                        let x = Temp.LastIndexOf('l')
                        where x != -1 && Temp.Substring(x) == "l"
                        select Temp;
            foreach (var Result in v)
            {
                Console.WriteLine(Result);
            }

        }
    }
}

alt text

Ответы

▲ 3Принят

Вы выполняете этот код под дебагом. Соответственно, Было бы странно, если бы при отладке вы не могли видеть состояние локальных переменных и/или не могли пошагово выполнить код и отследить это выполнение. Поэтому для таких целей необходимо чтобы данные могли быть заранее просчитаны. Вероятно (разумеется, я могу лишь предполагать, поскольку не знаю устройства отладчика VS) под эти богоугодные делишки выделяется отдельный поток, который по мере необходимости просчитывает то, что необходимо для просмотра отладочной информации. Разумеется, этот гипотетический фоновый поток - особенность режима отладки, и код вашей программы знать о нем не знает и не может использовать его результаты. Точнее даже, сделать так, чтобы собственно программа могла использовать эти предварительно вычисляемые отоладчиком результаты разумеется было бы можно, но вот зачем? Слишком уж странная необходимость

З.Ы. совершенно не в тему, однако, @polyakov_s позвольте полюбопытствовать, почему вы всех господами называете? Вы сами, извините, конечно, из холопов?