C# “我该怎么做?”;运行直到此变量发生变化;什么时候调试?

C# “我该怎么做?”;运行直到此变量发生变化;什么时候调试?,c#,debugging,variables,visual-studio-express,watch,C#,Debugging,Variables,Visual Studio Express,Watch,在调试我的C#时,我经常想知道变量的值何时变化,然后调查程序的状态 目前,我是这样做的: 观察列表有问题的变量 物理垃圾邮件F10(单步跳过的快捷方式),直到我看到值更改为止 然而,所需F10的数量令人恼火 我想,这肯定是自动化的。但我在我的Microsoft Visual C#Express中找不到这一功能,这让我感到惊讶。毕竟,监视列表会自动以鲜红色突出显示更改的值 我遗漏了什么吗?是您要找的,但它们似乎在Visual Studio Express中不可用 在VisualStudio(非Ex

在调试我的C#时,我经常想知道变量的值何时变化,然后调查程序的状态

目前,我是这样做的:

  • 观察列表有问题的变量
  • 物理垃圾邮件F10(单步跳过的快捷方式),直到我看到值更改为止
  • 然而,所需F10的数量令人恼火

    我想,这肯定是自动化的。但我在我的Microsoft Visual C#Express中找不到这一功能,这让我感到惊讶。毕竟,监视列表会自动以鲜红色突出显示更改的值

    我遗漏了什么吗?

    是您要找的,但它们似乎在Visual Studio Express中不可用


    在VisualStudio(非Express)中,它的工作方式是使用等于监视值的表达式创建条件断点,并将“已更改”作为断点条件。

    以下是我在VisualStudio中的操作方法。按F9键或单击最左边距设置断点。然后在出现的红点上单击鼠标右键,然后选择“条件”命令。还有其他选择


    但是,Visual Studio Express中可能不支持此操作。

    您可以使用条件断点


    请参见

    您可以编写一个if语句,检查是否有更改,并在该if语句中出现断点,因此它最初会中断,然后单击“继续”,它将继续运行,直到到达该断点。

    快速版的简单技巧:

    private string myValue;
    public string MyValue
    {
      set
      {
        if (this.myValue != value) Debugger.Break();
        this.myValue = value;
      }
    }
    

    使用调试器。根据某些运行时条件中断,或者右键单击某些断点,然后选择“条件中断->已更改”

    编辑:在Express中对此一无所知

  • 设置代码暂停的断点
  • 打开断点窗口(调试->窗口->断点)
  • 右键单击断点并选择条件
  • 将条件设置为变量名,然后选择已更改单选按钮
  • 单击确定,然后按正常方式调试:)

  • 如果您想在某个断点处捕获变量更改,而不是准确捕获更改的位置,则设置断点,右键单击它并选择“条件”。假设您的变量名为X,当前值为A。在条件字段中输入“X!=A”


    现在,只有在X更改为A以外的某个值后,才会命中断点。

    不太可能。我假设OP需要一种数据断点,每当任何东西触及给定的内存位置时都会触发该断点。这种断点在VisualStudio中是不可用的。相反,如果数据更改且代码位于某个预定义位置,则会触发条件断点。@如果我错了,Vlad会纠正我,但这是可能的,但确切地说,C#的问题在于压缩垃圾收集器,它可以随时在内存中移动数据,因此,调试器应该在压缩阶段相应地移动数据断点(这似乎是一项非常繁琐的任务,但并非不可能实现)。非托管语言没有这个问题,所以数据断点。这对我来说不起作用,因为我的代码很大,而且所讨论的变量可以在许多地方更改。(我必须编写一千条if语句。)目前,我的部分代码故意直接更改变量,而没有经过setter。此外,setter除了设置值之外,还做了很多事情。如果我为“setter direct”和通过setter访问创建了单独的setter,那么该字段仍然可以从class.AFAIK直接访问,只有它们的本机调试器支持这一点。