Visual Studio 2010 - 中断任何更改对象属性的内容

时间:2010-08-30 12:14:01

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

在Visual Studio 2010中是否可以打破更改对象属性的任何内容(例如方法)?

或者是否可以找出ASP.NET Webforms应用程序中是否更改了对象属性?


更新:

正确答案可在以下网址找到:http://stackoverflow.com/questions/2682613/cant-set-breakpoints-on-an-auto-property-setter-why/6713920#6713920

5 个答案:

答案 0 :(得分:13)

如果您可以控制声明属性的代码,那么当然可以在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;
    }
}

如果该值实际上是字段而不是属性,您仍然可以将其更改为属性以实现相同的目的。

如果您无权访问声明该属性的代码,那么它就会变得更加困难。我个人所做的就是这个,但这有点费力:

  1. 在声明属性的类型的Program类中声明一个公共静态字段。

  2. 在程序的早期,找到对其属性值更改的对象的引用,并将该引用放在此静态字段中。如有必要,请使用Reflection检索私有字段。

  3. 调试时将global::MyNamespace.Program.MyField.ImportantProperty添加到Watch窗口。

  4. 逐步执行代码,直到观察窗口中的值发生变化。

答案 1 :(得分:3)

听起来你要求的功能会导致Visual Studio在对象上更改属性/字段时中断。

对于属性,您可以使用普通断点和条件执行此操作。只需在属性设置器上设置断点,右键单击并选择条件。然后添加一个简单的检查以查看新值和现有值是否不同

value != backingField

对于字段,确实没有好的解决方案。 C ++调试器有一个名为Data BreakPoints的功能,它具有这种行为。但它们不适用于托管语言,主要是因为CLR调试器不支持它们。您可以做的最好的事情是暂时将您的字段更改为属性并使用上述方法。

答案 2 :(得分:2)

右键单击代表断点的红点 - 选择Condition并在希望断点中断执行时输入表达式,或者在值发生变化时选中Has changed以中断。

答案 3 :(得分:1)

我认为在VS IDE中有一种方法可以让你设置这样的通用断点。如果你真的需要这个并愿意做一些代码更改,你可以看一下partial methods。使用部分方法,您可以定义部分方法并从您的setter中调用它。当您想要调试以找出谁正在调用setter时,您可以提供partial方法的虚拟实现。完成调试后,您可以摆脱实现,编译器不会生成与该方法相关的任何内容,就好像它不存在一样。这会污染您的代码,除非您可以考虑来自您的setter的部分方法调用的其他潜在用途。但是,我只是想把它扔出去,以便你知道。

答案 4 :(得分:-5)

您可以将System.Diagnoistic.Debugger.Break()方法用于以下目的

if(x!= y)
    Debugger.Break()