【问题标题】:Why breakpoint is not reached in VisualStudio 2010?为什么在 Visual Studio 2010 中未达到断点?
【发布时间】:2015-02-02 04:11:00
【问题描述】:
    static void Main(string[] args)
    {
        List<int> li = new List<int>() { 1, 20, 30, 4, 5 };
        GetNosLessThan5(li);
    }

    public static IEnumerable<int> GetNosLessThan5(List<int> numbers)
    {
        foreach (var v in numbers)
        {
            if (v < 5)
                yield return v;
        }
    }

我在 void main 的开头放置了一个调试点。当我连续按f11时,黄色箭头只覆盖主功能块,调试终止。它根本没有达到“getnoslessthan5”功能。困惑。!

【问题讨论】:

    标签: c# visual-studio-2010 visual-studio-debugging


    【解决方案1】:

    您永远不会真正迭代结果,因此永远不会执行 GetNosLessThan5 函数的实际主体。编译器在底层创建了一个迭代器,但实际上需要枚举它才能运行函数体。

    请参阅MSDN Documentation about Iterators

    迭代器可用于遍历集合,例如列表和数组。

    迭代器方法或 get 访问器对集合执行自定义迭代。迭代器方法使用 Yield (Visual Basic) 或 yield return (C#) 语句一次返回每个元素。当到达 Yield 或 yield return 语句时,会记住代码中的当前位置。下次调用迭代器函数时,将从该位置重新开始执行。

    您可以使用 For Each...Next (Visual Basic) 或 foreach (C#) 语句或使用 LINQ 查询从客户端代码中使用迭代器。

    【讨论】:

    • 但是在 main 里面有一个对函数的调用,对吧?所以应该正确执行该功能。 ?
    • @callyaser 不,您正在调用一个返回 IEnumerable 的函数 - 换句话说,GetNosLessThan5 返回一个显示“我可以迭代”的对象。它确实 返回枚举的结果 - 为此您必须调用 .ToList 或实际计算数字的类似方法。 Iterators 是 C# 中的一点编译器魔法。
    • (这是一种优化技术,因为迭代器的运行成本可能很高,甚至是无限的。调用者有责任决定是否运行、何时运行以及运行多长时间)
    • 我明白了,先生。!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2012-02-26
    • 1970-01-01
    相关资源
    最近更新 更多