我在框架中看到了几个具有此行为的类(监视窗口中的刷新符号和警告).这是由属性控制的吗?如果是这样,我怎样才能在我的库中模拟这个?
编辑:感谢您的信息!为了澄清,我正在开发一个具有必须从单个线程访问数据的属性的框架.不幸的是,当我在调试器中时,由于监视窗口等,我得到一些奇怪的行为.我有使用Debugger Browsable属性的经验; 但是,我希望在主线程访问/设置它们之后显示属性.我已经看到,尤其是在IEnumerables中,如果没有用户输入,调试器将无法进行评估....有没有办法将这些属性标记为需要"隐含评估",或者我可以不吃蛋糕而且也吃它?
这不受属性控制.这是调试器的固有特性.
此功能的根本原因是防止用户进行不需要的功能评估.Func Evals在调试器中是一个危险的操作,可能导致显着的减速或损坏的程序状态.调试器非常谨慎,以确保它不会无意中执行额外的功能,这可能会降低您的调试体验.
如果watch/locals/auto窗口中有一个项目可能导致func eval并且调试器不相信函数应该发生,则该值将变灰并且值列中将出现刷新按钮.单击该按钮告诉调试器,"我真的不想评估该表达式".
调试器中出现这种情况的原因有很多.以下2个是最有可能的.
隐性财产评估被禁用
工具 - >调试器 - >选项 - >启用隐式属性评估
如果未选中此值,则告诉调试器请不要自动评估属性.引擎盖下的属性只是函数调用.它们通常比正常的函数调用更安全,但并非总是如此.
但您仍然可以通过直接在监视窗口中键入属性来强制评估属性.如果您连续键入2,则第一个值将变为"陈旧".这是因为在监视窗口中键入第二个表达式将导致重新计算所有其他表达式.为什么?因为评估任何表达式的行为可能会改变其他表达式的结果.
因为隐式函数关闭,所以第一个属性不会自动评估,您必须强制它.
Func Eval和Step
如果将表达式添加到监视窗口以执行功能评估然后执行步骤操作,则该值将在监视窗口中"停止".
这样做有很多原因,但最有影响力的原因之一就是踩踏性能.用户在监视窗口中键入多个表达式是很常见的,并且进行功能评估绝对并不罕见.一次一个这些不是很慢.但是想象一下,你正试图快速浏览一些代码,并且你在观察窗口中有10个func evals.这可能很快加起来并显着降低您的踩踏体验.因此,func evals不会自动重新评估.