如何在C#中在运行时跟踪变量?

如何在运行时在C#中更改变量的值? 我对调试器在通过执行步骤跟踪变量时提供的function感兴趣,只是我需要从代码中调用它。 某种键值观察,但对于各种变量(局部,类,静态等),不仅仅是属性。 因此,基本上,当变量的值发生变化时会收到通知。

您正在假设调试器可以跟踪变量。 它不能。

对于非托管代码,处理器可以使用专用的调试寄存器来设置数据断点。 最多提供三个。 当它看到特定的内存位置被写入时,它会生成硬件中断。 但是,这个非常有用的function在托管代码中不可用。 垃圾收集器与它完全不兼容,它会移动对象,给它们另一个地址。

托管调试器支持断点上的“命中时”条件,允许您将信息转储到输出窗口。 然而,这需要断点,它不能由变量值的变化触发。 它实际上也减慢了代码执行速度,因为调试器在执行条件之前实际上进入了中断状态。

放置这样一个断点的显而易见的地方是属性设置器。 您需要在代码中实现此function。 例如,您可以使用Trace类在该setter中执行任何操作。

要添加Marc所说的内容,如果要对许多属性和方法执行此操作,可能需要查看面向方面的编程技术和PostSharp等库。

http://www.sharpcrafters.com/postsharp

托管调试器几乎可以使用ICorDebug COM API。 您感兴趣的部分是ICorDebugValue及其后代。 请注意,很多调试API要求进程不运行(即遇到断点),以便进行各种检查。 ICorDebug高级概述就在这里 。 关于它的文档有点稀疏,但一些谷歌搜索可能会有所帮助。 祝好运。

没有调试器你唯一明智的方法就是:不要使用变量,而是使用属性,并且(可能有条件地)将跟踪添加到setter:

 private int myValue; public int MyValue { get {return myValue;} set { SomeTraceMethod(myValue, value, ...); myValue = value; } } 

显然,这不能用于任意字段/变量。

正如其他人提到的那样,在使用属性时,这种机制才有意义。 在.NET中,您可以使用INotifyPropertyChanged接口。

有关如何实现它的示例,请参阅

如何:实现INotifyPropertyChanged接口

引用的文章明确谈到了Windows窗体,但您并没有这样做(该接口实际上是在System.dll的System.ComponentModel命名空间中声明的)。 实际上,该接口广泛用于数据绑定场景,例如在WPF中。