【发布时间】:2010-08-30 12:14:00
【问题描述】:
在 Visual Studio 2010 中是否可以中断任何更改对象属性的内容(例如方法)?
或者是否可以查明 ASP.NET Webforms 应用程序中的对象属性是否发生了变化?
更新:
【问题讨论】:
-
你说的是哪个属性?内置到标准控件之一的属性?还是您自己的某个控件上的属性?
标签: c# visual-studio debugging visual-studio-2010
在 Visual Studio 2010 中是否可以中断任何更改对象属性的内容(例如方法)?
或者是否可以查明 ASP.NET Webforms 应用程序中的对象属性是否发生了变化?
更新:
【问题讨论】:
标签: c# visual-studio debugging visual-studio-2010
如果您可以控制声明该属性的代码,那么您当然可以在 setter 中放置一个断点。即使它当前是一个自动实现的属性,例如:
public string SomeProperty { get; set; }
您可以像这样轻松更改它:
private string _someProperty;
public string SomeProperty {
get { return _someProperty; }
set {
// Set breakpoint here, or type Debugger.Break();
_someProperty = value;
}
}
如果该值实际上是一个字段而不是一个属性,您仍然可以将其更改为一个属性来实现相同的目的。
如果您无权访问声明该属性的代码,那就有点困难了。个人做的就是这个,不过有点费力:
在您的 Program 类中声明一个声明属性类型的公共静态字段。
在程序的早期,找到对属性值发生变化的对象的引用,并将该引用放在这个静态字段中。如有必要,使用反射检索私有字段。
在调试时将global::MyNamespace.Program.MyField.ImportantProperty 添加到监视窗口。
单步执行代码,直到监视窗口中的值发生变化。
【讨论】:
听起来您要求的功能是在对象的属性/字段发生更改时会导致 Visual Studio 中断。
对于属性,您可以使用普通断点和条件来执行此操作。只需在属性设置器上设置断点,右键单击并选择条件。然后添加一个简单的检查,看看新值和现有值是否不同
value != backingField
对于领域,确实没有好的解决方案。 C++ 调试器有一个名为 Data BreakPoints 的特性,它具有这种行为。但它们不适用于托管语言,主要是因为 CLR 调试器不支持它们。您可以做的最好的事情是暂时将您的字段更改为属性并使用上述方法。
【讨论】:
右键单击代表断点的红点 - 选择 Condition 并在您希望断点中断执行时输入表达式,或选中 Has changed 在值更改时中断。
【讨论】:
我认为 VS IDE 中没有一种方法可以让您设置这样的通用断点。如果你真的需要这个并且愿意做一些代码更改,你可以看看partial methods。使用分部方法,您定义一个分部方法并从您的设置器中调用它。当您想调试以找出谁在调用 setter 时,您可以提供部分方法的虚拟实现。完成调试后,您可以摆脱实现,编译器不会生成与该方法相关的任何内容,就好像它不存在一样。这会污染您的代码,除非您能想到来自 setter 的部分方法调用的其他潜在用途。但是,我只是想把它扔出去让你知道。
【讨论】:
您可以将 System.Diagnoistic.Debugger.Break() 方法用于其目的,如下所示
if(x!= y)
Debugger.Break()
【讨论】: