如何在运行时在C#中更改变量的值?我对调试器通过执行步骤跟踪变量时提供的功能感兴趣,只是我需要从代码中调用它。某种键值观察,但对于各种变量(局部,类,静态等),不仅仅是属性。因此,基本上,当变量的值发生变化时会收到通知。
答案 0 :(得分:3)
要添加Marc所说的内容,如果你想为许多属性和方法做这个,你可能想要查看面向方面的编程技术和PostSharp等库。
答案 1 :(得分:3)
您正在假设调试器可以跟踪变量。它不能。
对于非托管代码,处理器可以使用专用的调试寄存器来设置数据断点。最多提供三个。当它看到特定的内存位置被写入时,它会生成硬件中断。但是,这个非常有用的功能在托管代码中不可用。垃圾收集器与它完全不兼容,它会移动对象,给它们另一个地址。
托管调试器确实支持断点上的“命中时”条件,允许您将信息转储到输出窗口。然而,这需要断点,它不能由变量值的变化触发。由于调试器在执行条件之前实际进入中断状态,因此确实会降低代码执行速度。
放置这样一个断点的显而易见的地方是属性设置器。您需要在代码中实现此功能。您可以使用Trace类在该setter中执行任何操作。
答案 2 :(得分:1)
托管调试器几乎可以使用ICorDebug
COM API。您感兴趣的部分是ICorDebugValue
及其后代。请注意,很多调试API要求进程不运行(即遇到断点),以便进行各种检查。 ICorDebug
的高级概述是here。关于它的文档有点稀疏,但一些谷歌搜索可能会有所帮助。祝你好运。
答案 3 :(得分:0)
没有调试器的唯一合理方法是:不要使用变量,而是使用属性,并且(可能有条件地)将跟踪添加到setter:
private int myValue;
public int MyValue {
get {return myValue;}
set {
SomeTraceMethod(myValue, value, ...);
myValue = value;
}
}
显然,这不能用于任意字段/变量。
答案 4 :(得分:0)
正如其他人所提到的那样,在使用属性时这样的机制才有意义。在.NET中,您可以使用INotifyPropertyChanged
接口。
有关如何实施该示例的示例,请参阅
<强> How to: Implement the INotifyPropertyChanged Interface 强>
引用的文章明确谈到了Windows窗体,但是你并没有这样做(接口实际上是在System.dll的System.ComponentModel
命名空间中声明的)。实际上,该接口广泛用于数据绑定场景,例如,在WPF中。