gpt4 book ai didi

c# - Visual Studio 调试 "quick watch"工具和 lambda 表达式

转载 作者:IT王子 更新时间:2023-10-29 03:36:33 29 4
gpt4 key购买 nike

为什么在“快速观察”窗口中调试时不能使用 lambda 表达式?

UPD:另见

Link

Link

最佳答案

不,你不能在 watch/locals/immediate 窗口中使用 lambda 表达式。正如 Marc 指出的那样,这非常复杂。不过,我想更深入地探讨这个话题。

大多数人在调试器中执行匿名函数时没有考虑到的是,它不会在真空中发生。定义和运行匿名函数的行为改变了代码库的底层结构。一般来说,尤其是从即时窗口更改代码是一项非常困难的任务。

考虑以下代码。

void Example() {
var v1 = 42;
var v2 = 56;
Func<int> func1 = () => v1;
System.Diagnostics.Debugger.Break();
var v3 = v1 + v2;
}

这个特定的代码创建了一个闭包来捕获值 v1。每当匿名函数使用在其范围之外声明的变量时,都需要闭包捕获。出于所有意图和目的,此函数中不再存在 v1。最后一行实际上看起来更像下面这样

var v3 = closure1.v1 + v2;

如果函数 Example 在调试器中运行,它将在 Break 行停止。现在想象一下,如果用户在监 window 口中键入以下内容

(Func<int>)(() => v2);

为了正确执行此调试器(或更合适的 EE)需要为变量 v2 创建一个闭包。这很难但并非不可能做到。

不过,真正让 EE 成为一项艰巨工作的是最后一行。现在应该如何执行该行?出于所有意图和目的,匿名函数删除了 v2 变量并将其替换为 closure2.v2。所以最后一行代码现在真的需要阅读

var v3 = closure1.v1 + closure2.v2;

然而,要在代码中实际获得这种效果,需要 EE 更改最后一行代码,这实际上是一个 ENC 操作。虽然这个特定示例是可能的,但大部分场景都不是。

更糟糕的是执行 lambda 表达式不应该创建一个新的闭包。它实际上应该是将数据附加到原始闭包。在这一点上,您直接进入了限制 ENC。

不幸的是,我的小例子只触及了我们遇到的问题的表面。我一直说我会写一篇关于这个主题的完整博客文章,希望这个周末我能有时间。

关于c# - Visual Studio 调试 "quick watch"工具和 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/725499/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com