【问题标题】:Iterate enumerable object while debugging in Visual Studio在 Visual Studio 中调试时迭代可枚举对象
【发布时间】:2010-09-18 08:24:41
【问题描述】:

在 Visual Studio 中调试时是否可以迭代集合并仅列出过滤的对象信息?我会为此使用即时窗口,但虽然它允许对对象执行方法,但似乎不允许执行自定义循环语句。

ASP.NET 中的最简单示例:

this.Page.Validate();
if (!this.Page.IsValid())
{
  // breakpoint here
}

我们如何迭代Page.Validators 集合并找到那些无效的+在该断点处输出它们的信息? (这不是主要问题,只是一个示例)

如果无法直接执行此操作,您是否有任何解决方法?不涉及代码修改的变通方法,只需在即时窗口或一些 Watch 表达式中编写代码。

在谷歌搜索时,我发现只有一种解决方法引用了here(虽然找不到原件):

"在你的代码中添加一个调试方法 做类似迭代的事情 集合中的所有对象。然后 您可以从 调试模式下的即时窗口 它会列举各种东西 为你。把它想象成一个 命令行调试器帮助器。你可以 想写多少就写多少。”

但这仍然是一种解决方法。我认为它应该是可行的,不需要太多的黑客攻击,更重要的是不需要修改代码。 当然,应该可以在一个语句中进行某种集合转换。

让我们坚持使用非泛型集合。 此外,即时窗口似乎不接受 lambda 表达式(尝试时出错:“表达式不能包含 lambda 表达式”)

【问题讨论】:

    标签: visual-studio debugging


    【解决方案1】:

    您可以尝试使用即时窗口和 LINQ-to-objects 调用。

    人为的例子:

     pages.Where((x) =>
     {
        if (x.IsValid)
        {
            Debugger.Break();
            return true;
        }
        return false;
     });
    

    更新:显然,这不起作用,因为即时窗口不允许 lambdas。但是,如果您将 lambda 实现为仅用于调试的方法,则可以这样做。

    [Conditional("DEBUG")]
    static bool BreakpointPredicate(YourItemType x)
    {
        if (x.IsValid)
        {
            Debugger.Break()
            return true;
        }
        return false;
    }
    

    然后在即时窗口中调用Where

    pages.Where(BreakPointPredicate);
    

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多