2010-05-26 80 views
5

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

+0

为什么调试器不是一个选项?这正是它的目的。 – 2010-05-26 10:49:53

+0

@ 0xA3因为我需要在运行时从应用程序中访问这些值,只能在它们更改时访问这些值。 – luvieere 2010-05-26 10:53:38

+0

如何将变量的变化值写入一个简单的日志文件。 – Shivam 2010-05-26 12:34:53

回答

3

您正在从调试器可以跟踪变量更改的假设开始工作。它不能。

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

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

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

+0

+ +1作为答案,但我有点不同意一个简单的条件断点放缓的点。由于C#被转换为字节码,对于调试器来说,最恰当的方式就是创建并插入一个字节码,该字节码将在值的位置处打印一个值。我没有看到为什么不能以这种方式完成它的原因 - 因此我调用了一个性能错误的调试器断点的另一个实现。 – 2015-05-14 08:06:50

+2

不,C#被转换为机器码,IL只是一个中间步骤。使用Debug> Windows> Disassembly来查看它。功能,而不是一个错误。 – 2015-05-14 08:19:00

0

你能做到这没有调试器将是唯一明智的方法:不使用变量,但是使用属性,以及(也许是有条件的)添加跟踪到二传手:

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

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

+0

调试器如何为任意变量执行此操作?没有一个调试库可以帮助我达到同样的跟踪水平吗? – luvieere 2010-05-26 11:18:44

0

正如其他使用性质时,这样做只能意会提到的机制。在.NET中,您可以使用INotifyPropertyChanged界面。

对于样品如何实现它看到

How to: Implement the INotifyPropertyChanged Interface

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

+0

我在问题中提到我对任意变量感兴趣,而不是属性。我知道INotifyPropertyChanged,我不知道如何跟踪任意变量,就像调试器一样。 – luvieere 2010-05-26 12:04:30

1

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