如何在C#中运行时更改变量的值?我对调试器在通过执行步骤跟踪变量时提供的功能感兴趣,只是需要从我的代码中调用它。某种键值观察,但对于各种变量(本地,类,静态等),不仅属性。所以,基本上,当变量的值发生变化时会收到通知。如何在C#中运行时跟踪变量?
回答
您正在从调试器可以跟踪变量更改的假设开始工作。它不能。
对于非托管代码,处理器有专用的调试寄存器可以设置数据断点。最多提供三个。它在看到特定内存位置被写入时产生硬件中断。然而,这个非常有用的功能在托管代码中不可用。垃圾收集器与它完全不兼容,它会移动物体,给他们另一个地址。
托管调试器在断点上确实支持“何时命中”条件,允许您将信息转储到输出窗口。然而,这需要一个断点,它不能由变量值的变化触发。它也真的减缓代码执行,因为在执行条件之前调试器实际上进入休息状态。
放置这样一个断点的显而易见的地方是属性设置器。这是你需要在代码中实现这个功能。您可以在该设置器中执行任何您想要的操作,例如使用Trace类。
+ +1作为答案,但我有点不同意一个简单的条件断点放缓的点。由于C#被转换为字节码,对于调试器来说,最恰当的方式就是创建并插入一个字节码,该字节码将在值的位置处打印一个值。我没有看到为什么不能以这种方式完成它的原因 - 因此我调用了一个性能错误的调试器断点的另一个实现。 – 2015-05-14 08:06:50
不,C#被转换为机器码,IL只是一个中间步骤。使用Debug> Windows> Disassembly来查看它。功能,而不是一个错误。 – 2015-05-14 08:19:00
你能做到这没有调试器将是唯一明智的方法:不使用变量,但是使用属性,以及(也许是有条件的)添加跟踪到二传手:
private int myValue;
public int MyValue {
get {return myValue;}
set {
SomeTraceMethod(myValue, value, ...);
myValue = value;
}
}
显然这不能用于任意字段/变量。
调试器如何为任意变量执行此操作?没有一个调试库可以帮助我达到同样的跟踪水平吗? – luvieere 2010-05-26 11:18:44
要添加到Marc所说的内容中,如果您想要对许多属性和方法执行此操作,您可能需要查看面向方面的编程技术以及诸如PostSharp之类的库。
正如其他使用性质时,这样做只能意会提到的机制。在.NET中,您可以使用INotifyPropertyChanged
界面。
对于样品如何实现它看到
明确有关Windows窗体引用的文章会谈,但你是不是绑定到(该接口在实际声明System.dll中的System.ComponentModel
命名空间)。实际上,该接口广泛用于数据绑定场景,例如在WPF中。
我在问题中提到我对任意变量感兴趣,而不是属性。我知道INotifyPropertyChanged,我不知道如何跟踪任意变量,就像调试器一样。 – luvieere 2010-05-26 12:04:30
托管调试器几乎所有的东西都使用了COM API的ICorDebug
。你感兴趣的部分是ICorDebugValue
及其后代。请注意,很多调试API要求进程不运行(即遇到断点),以便进行各种检查。ICorDebug
的高层次概述是here。它的文档有点稀疏,但一些谷歌搜索可能会有所帮助。祝你好运。
- 1. 如何跟踪变量?
- 2. 如何在Logicblox中跟踪运行?
- 3. 如何在Firefox中运行时访问JavaScript执行跟踪?
- 4. 如何在C++/CLI中模拟成员引用跟踪变量?
- 5. 如何在Eclipse中跟踪JRE时观察变量?
- 6. 跟踪xquery变量
- 7. 如何跟踪4000行代码过程中使用的变量?
- 8. as3跟踪变量数值
- 9. 如何在Android中跟踪C线程?
- 10. C++如何跟踪局部变量/对象
- 11. 运行时对象参考跟踪
- 12. 如何跟踪C++ GNU xgettex执行?
- 13. 如何在Perl中跟踪全局变量?
- 14. 如何在.net中执行跟踪
- 15. 如何跟踪过程执行时间?
- 16. Python中,跟踪未定义的变量
- 17. 跟踪会话变量中的语言
- 18. 如何跟踪客户端的大厨独奏运行时变化?
- 19. 如何在Websphere V7中在运行时编程地修改跟踪服务?
- 20. 如何在多线程的C++运行过程中获取线程跟踪?
- 21. Django:如何获取堆栈跟踪运行时警告
- 22. 如何通过SBT运行规格时消除堆栈跟踪?
- 23. java JTable如何跟踪行
- 24. 跟踪所有正在运行的块
- 25. Fortran中的运行代码跟踪
- 26. 如何跟踪在Android中运行的应用程序的持续时间
- 27. 如何在Laravel中实现对长时间运行的导入的跟踪
- 28. 运动跟踪与Blob跟踪
- 29. 当可执行文件正在运行时跟踪数据流
- 30. 如何在JavaScript跟踪一个字符串变量
为什么调试器不是一个选项?这正是它的目的。 – 2010-05-26 10:49:53
@ 0xA3因为我需要在运行时从应用程序中访问这些值,只能在它们更改时访问这些值。 – luvieere 2010-05-26 10:53:38
如何将变量的变化值写入一个简单的日志文件。 – Shivam 2010-05-26 12:34:53