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