如何在C#中在运行时跟踪变量?
如何在运行时在C#中更改变量的值? 我对调试器在通过执行步骤跟踪变量时提供的function感兴趣,只是我需要从代码中调用它。 某种键值观察,但对于各种变量(局部,类,静态等),不仅仅是属性。 因此,基本上,当变量的值发生变化时会收到通知。
您正在假设调试器可以跟踪变量。 它不能。
对于非托管代码,处理器可以使用专用的调试寄存器来设置数据断点。 最多提供三个。 当它看到特定的内存位置被写入时,它会生成硬件中断。 但是,这个非常有用的function在托管代码中不可用。 垃圾收集器与它完全不兼容,它会移动对象,给它们另一个地址。
托管调试器支持断点上的“命中时”条件,允许您将信息转储到输出窗口。 然而,这需要断点,它不能由变量值的变化触发。 它实际上也减慢了代码执行速度,因为调试器在执行条件之前实际上进入了中断状态。
放置这样一个断点的显而易见的地方是属性设置器。 您需要在代码中实现此function。 例如,您可以使用Trace类在该setter中执行任何操作。
要添加Marc所说的内容,如果要对许多属性和方法执行此操作,可能需要查看面向方面的编程技术和PostSharp等库。
https://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中。
上述就是C#学习教程:如何在C#中在运行时跟踪变量?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1017902.html