【问题标题】:Breakpoint not hit when method called in lambda在 lambda 中调用方法时未命中断点
【发布时间】:2011-10-18 09:11:22
【问题描述】:

当我在从 lambda 表达式调用的方法中放置断点时,断点永远不会被命中。当我将方法调用移到 lambda 之外时,会触发断点。

例如:

Function IncrementAll(ByVal items As IEnumerable(Of Integer)) As IEnumerable(Of Integer)
  Return items.Select(Function(i) Increment(i))
End Function

Function Increment(ByVal i As Integer) As Integer
  Return i + 1 'Breakpoint here
End Function

如果我调用 IncrementAll,Increment 中的断点不会被命中。有没有办法让 VS 2008 在这些断点处停止?我讨厌为了调试而将所有的 LINQ 重写为循环。

【问题讨论】:

  • 有趣,我知道我已经在 .NET 4 中完成了这项工作。您已经验证了“items”中有元素,并且您正在调试配置中运行(即断点将是打到项目的其他地方)?
  • 是的,如果我在 items.Select 上面放置一个断点,它将命中,如果我将 items.Select 转换为循环,那么 Increment 中的断点将会命中。

标签: vb.net visual-studio-2008 debugging .net-3.5


【解决方案1】:

所以,我想通了。 Select 返回一个 IEnumerable,并且对每个项目的 Increment 的实际执行被推迟,直到您尝试访问 IEnumerable 中的项目。获得所需效果的最快方法是:

Function IncrementAll(ByVal items As IEnumerable(Of Integer)) As IEnumerable(Of Integer)
    Return items.Select(Function(i) Increment(i)).ToList()
End Function

ToList() 立即枚举,因此在每个元素上执行 Increment,您的断点将触发。

【讨论】:

  • 就是这样。断点正在工作,但它只会在我认为它会的很久之后才会触发,而且我不会让它运行到那个点。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 2013-05-09
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多