C# 调试器未命中断点

C# 调试器未命中断点,c#,delegates,debugging,list,breakpoints,C#,Delegates,Debugging,List,Breakpoints,我发现了一些很奇怪的事情(我想!)。如果我尝试在yes()方法中设置断点,它将永远不会在程序执行函数时暂停程序。如果我尝试对任何其他代码行执行相同的操作,它将按预期工作。这是一只虫子,还是有什么东西在逃避我 过滤器将返回2个对象,除调试器外,其他一切都正常工作 private void Form1_Load(object sender, EventArgs e) { List<LOL> list = new List<LOL>(); list.Add(ne

我发现了一些很奇怪的事情(我想!)。如果我尝试在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;
    }
}
private void Form1\u加载(对象发送方,事件参数e){
列表=新列表();
添加(新LOL());
添加(新LOL());
IEnumerable筛选器=列表。其中(
代表(LOL LOL){
返回lol.yes();
}
);

string l=“;Enumerable.Where是一个惰性运算符——除非调用Where返回的IEnumerable中的某个内容(即对其调用.ToList()),否则不会调用函数

尝试将您的代码更改为此,并查看是否调用了此代码:

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

string l = "";
。。。。
IEnumerable筛选器=列表。其中(
代表(LOL LOL){
返回lol.yes();
}
).ToList();
字符串l=“”;

您必须具体化列表。添加一个

filter.ToList();

…在声明之后,您将到达断点。关于这一点,我所看到的最好的讨论是。它比我所能做的更公平。

正如其他人所说,您刚刚定义了标准,但没有要求它执行。这称为延迟加载(伙计们,如果我错了,请纠正我)

在过滤器上运行foreach循环以查看发生了什么。

乔纳森是正确的

尝试运行此控制台应用程序,并在指示的位置设置断点以清楚地看到它

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;
            }

        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
列表=新列表();
添加(新LOL());
添加(新LOL());
IEnumerable筛选器=列表。其中(
代表(LOL LOL)
{
返回lol.yes();
}
);
//断点#2还没有找到。
Console.Write(“无断点”);//断点#1
//(现在将命中断点#2。)
Write(“断点!”+filter.Count());
}
类LOL
{
公共布尔是()
{
bool-ret=true;//断点#2
返回ret;
}
}
}
}

记住,像Where这样的查询方法的结果是一个表示查询的对象。它不是查询的结果。它是查询本身。直到你说“嘿,查询,你的结果是什么?”时,查询才会真正执行。你现在可以回答这个小难题:问题:解决方案: