【问题标题】:Can't step into iterator block whilst debugging (C#)调试时无法进入迭代器块(C#)
【发布时间】:2010-11-04 16:13:36
【问题描述】:

我正在尝试调试从单元测试项目中执行的代码,但是当我尝试进入一个方法时,它只是直接传递到下一行,并且该方法内的断点没有被命中。该方法在不同项目中的类上,但所有代码都是在调试模式下构建的,我已经尝试清理和重建解决方案,但没有任何乐趣。

但是,这只是在我向方法中添加了一个迭代器块之后才发生的。当我删除它并重建时,我可以很好地介入。奇怪吗?

我正在使用 Visual Studio 2010 Beta 1,这可能只是一个错误吗?

【问题讨论】:

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


【解决方案1】:

迭代器块使用延迟执行 - 意思是:在您真正开始迭代数据之前,不会执行任何操作。

那么:数据是否已经迭代?是否有任何值循环?如果需要添加尽早运行的验证逻辑,目前需要两种方法:

public static IEnumerable<int> GetNumbers(int from, int to) {
    // this validation runs ASAP (not deferred)
    if (to < from) throw new ArgumentOutOfRangeException("to");
    return GetNumbersCore(from, to);
}
private static IEnumerable<int> GetNumbersCore(int from, int to) {
    // this is all deferred
    while (from <= to) {
        yield return from++;
    }
}

【讨论】:

    【解决方案2】:

    马克是正确的。该方法被延迟执行,在迭代器实际执行之前,您无法单步执行该方法。

    当我需要在单元测试中调试迭代器块时,我会执行以下操作。假设该方法名为 GetStuff。

    [TestMethod]
    public void TestGetStuff() {
      var obj = GetStuffObje();
      var list = obj.GetStuff().ToList();
    }
    

    .ToList() 调用将强制迭代器执行完成。然后我在 GetStuff 方法中设置断点并启动调试会话

    【讨论】:

      猜你喜欢
      • 2018-08-28
      • 2011-10-05
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多