Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有.Net属性阻止调试器中的属性求值?_.net_Ide_Frameworks_Attributes - Fatal编程技术网

是否有.Net属性阻止调试器中的属性求值?

是否有.Net属性阻止调试器中的属性求值?,.net,ide,frameworks,attributes,.net,Ide,Frameworks,Attributes,我在框架中看到了几个具有这种行为的类(监视窗口中的刷新符号和警告)。这是由属性控制的吗?如果是这样,我如何在我的库中模拟它 编辑:谢谢您提供的信息!为了澄清这一点,我正在开发一个具有属性的框架,这些属性必须从单个线程访问数据。不幸的是,由于监视窗口等原因,我在调试器中遇到一些奇怪的行为。我有调试器可浏览属性的经验;但是,我更希望在主线程访问/设置属性之后显示它们。我已经看到,特别是在IEnumerables中,调试器在没有用户输入的情况下不会进行计算。。。有没有办法将这些属性标记为需要“隐式评估

我在框架中看到了几个具有这种行为的类(监视窗口中的刷新符号和警告)。这是由属性控制的吗?如果是这样,我如何在我的库中模拟它


编辑:谢谢您提供的信息!为了澄清这一点,我正在开发一个具有属性的框架,这些属性必须从单个线程访问数据。不幸的是,由于监视窗口等原因,我在调试器中遇到一些奇怪的行为。我有调试器可浏览属性的经验;但是,我更希望在主线程访问/设置属性之后显示它们。我已经看到,特别是在IEnumerables中,调试器在没有用户输入的情况下不会进行计算。。。有没有办法将这些属性标记为需要“隐式评估”,或者我可以不吃蛋糕也不吃

这不受属性控制。这是调试器的固有特性

此功能的根本原因是防止用户进行不必要的功能评估。Func Evals在调试器中是一个危险的操作,可能会导致严重的速度减慢或程序状态损坏。调试器会非常小心地确保它不会无意中执行额外的函数评估,这可能会降低调试体验

如果“监视/局部变量/自动”窗口中的某个项目可能导致函数评估,并且调试器不认为应该发生函数评估,则该值将灰显,并且“值”列中将显示“刷新”按钮。单击该按钮告诉调试器,“不,我真的想计算该表达式”

在调试器中发生这种情况的原因有很多。但以下两种情况最有可能发生

隐式属性评估已禁用

工具->调试器->选项->启用隐式属性计算

如果未选中此值,则说明调试器请不要自动计算属性。引擎盖下的属性只是函数调用。它们通常比普通函数调用更安全,但并不总是如此

但是,您仍然可以通过直接在“监视”窗口中键入属性来强制计算属性。如果在一行中键入2,则第一个值将变为“过时”。这是因为在“监视”窗口中键入第二个表达式将导致重新计算所有其他表达式。为什么?因为计算任何表达式的行为都可能改变其他表达式的结果

由于implicit func eval处于禁用状态,因此第一个属性不会自动求值,必须强制求值

功能评估和步骤

如果将表达式添加到执行函数求值的监视窗口,然后执行单步操作,则该值将在监视窗口中“过时”


这样做有很多原因,但最有影响的原因之一是步进性能。用户在“监视”窗口中键入许多表达式是很常见的,而且函数求值也不少见。一次一个这些不是很慢。但是想象一下,当你试图快速浏览一些代码时,你的观察窗口中有10个func eval。这可能会迅速增加并显著降低您的踏步体验。因此,函数求值不会自动重新求值

虽然这不会生成您所指的刷新图标,但一个非常有用的属性是System.Diagnostics.DebuggerBrowsableAttribute,它允许您隐藏字段,使其永远不会显示在监视窗口中。如果属性访问器复制了字段和,并且它们不需要显示两次,或者属性执行了一些实质性的操作(如您所建议的),并且您需要始终抑制它,以便调试器不会对其进行计算,那么这将非常有用。

这并不完全是您要查找的,但是如果您应用
[DebuggerStepThrough]
属性设置为属性的getter/setter,它将防止调试器在属性上中断,除非在行上显式设置断点。如果您希望等待并在知道安全评估后设置断点,这可能很有用。您也可以使用
[DebuggerHidden]
如果你想隐藏它,不让它一起调试。

我把鼠标移到不应该移动的地方,然后评估模拟的属性,破坏了一些调试会话。这会将我设置的expectactions抛出窗口。