Отладчик не достигает точки останова - PullRequest
7 голосов
/ 23 июня 2009

Я нашел что-то довольно странное (я думаю!). Если я попытаюсь установить точку останова в методе yes (), он никогда не остановит программу при выполнении функции. Если я попытаюсь сделать то же самое с любой другой строкой кода, она будет работать так, как ожидалось. Это ошибка или что-то, что ускользает от меня?

Фильтр вернет 2 объекта, кажется, что все работает, как ожидалось, кроме отладчика.

private void Form1_Load(object sender, EventArgs e) {
    List<LOL> list = new List<LOL>();
    list.Add(new LOL());
    list.Add(new LOL());

    IEnumerable<LOL> filter = list.Where(
        delegate(LOL lol) {
            return lol.yes();
        }
    );

    string l = "";   <------this is hit by the debugger
}

class LOL {
    public bool yes() {
        bool ret = true; <---------this is NOT hit by the debugger
        return ret;
    }
}

Ответы [ 4 ]

17 голосов
/ 23 июня 2009

Enumerable.Where - это ленивый оператор - пока вы не вызовете что-то, что проходит через IEnumerable, возвращаемый функцией where (т. Е. Вызывает .ToList () для него), ваша функция не будет вызвана.

Попробуйте изменить код на это и посмотреть, будет ли он вызван:

....
IEnumerable<LOL> filter = list.Where(
    delegate(LOL lol) {
        return lol.yes();
    }
).ToList();

string l = "";
2 голосов
/ 23 июня 2009

Джонатан прав.

Попробуйте запустить это консольное приложение и установить точки останова там, где это указано, чтобы было ясно.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<LOL> list = new List<LOL>();
            list.Add(new LOL());
            list.Add(new LOL());

            IEnumerable<LOL> filter = list.Where(
                delegate(LOL lol)
                {
                    return lol.yes();
                }
            );

            // Breakpoint #2 will not have been yet.
            Console.Write("No Breakpoint"); // Breakpoint #1 
            // (Breakpoint #2 will now be hit.)
            Console.Write("Breakpoint! " + filter.Count()); 
        }

        class LOL
        {
            public bool yes()
            {
                bool ret = true; // Breakpoint #2
                return ret;
            }

        }

    }
}
2 голосов
/ 23 июня 2009

Как уже говорили другие, вы только что определили свои критерии, но не просили его выполнить. Это называется отложенной загрузкой (ребята, поправьте меня, если я ошибаюсь).

Запустите цикл foreach на фильтре, чтобы увидеть, что происходит.

2 голосов
/ 23 июня 2009

Вы должны материализовать список. Добавить ...

filter.ToList();

... после объявления и вы достигнете своей точки останова. О лучшем обсуждении, которое я видел, это здесь . Это делает ленивую оценку намного лучше справедливости, чем я мог сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...