C# 在VisualStudio中调试时,在返回之前是否可以找到返回值?

C# 在VisualStudio中调试时,在返回之前是否可以找到返回值?,c#,visual-studio,visual-studio-debugging,C#,Visual Studio,Visual Studio Debugging,执行以下功能: DataTable go() { return someTableAdapter.getSomeData(); } 当我在此函数中设置断点时,是否有可能检查返回值go()直接耦合到.aspx页面中的数据网格 检查返回数据表的唯一方法是使用临时变量。但是,这有点不方便。还有别的办法吗?我不知道。请注意,如果您确实添加了一个变量,它将被编译器在发布版本中删除 更新: . 您可以在自动窗口中查看返回值,也可以在监视/即时窗口中使用$ReturnValue 只有从函数返回后才能

执行以下功能:

DataTable go() {
    return someTableAdapter.getSomeData();
}
当我在此函数中设置断点时,是否有可能检查返回值
go()
直接耦合到
.aspx
页面中的数据网格


检查返回数据表的唯一方法是使用临时变量。但是,这有点不方便。还有别的办法吗?

我不知道。请注意,如果您确实添加了一个变量,它将被编译器在发布版本中删除

更新: . 您可以在自动窗口中查看返回值,也可以在监视/即时窗口中使用
$ReturnValue

只有从函数返回后才能直接看到该值,因此访问该值的最简单方法是在函数调用上放置断点并逐步跳过(F10)调用


VS2015更新:嘘!不幸的是,它似乎不在VS2015(devenv v14)中

VS2017的更新:它回来了。(devenv v15)

您可以尝试选择
“someTableAdapter.getSomeData();”
,右键单击它,然后快速查看。

如果中间窗口没有设置标志或其他变量,但只返回一些内容,您也可以要求在中间窗口中计算值。

使用Shift-F11跳出go()方法,然后在“Autos”调试窗口中,它将显示刚刚从堆栈中弹出的方法调用的返回值(在本例中,是您想要的go()方法)。这是VisualStudio2005中的行为;我还没有使用Visual Studio 2008,所以我不知道在该版本中是否会出现相同的行为。

打开调试→ 自动窗口让你接近。它不会显示实际返回值,但会显示return语句中计算的内容。

我知道的唯一方法是在返回行上放置一个断点,然后调用Quick Watch窗口并输入返回的表达式:

someTableAdapter.getSomeData();

但这仅在调用不改变任何对象的状态时有效(因为当您恢复执行时,将有第二次调用相同的方法)。

将返回表达式拖放到监视窗口中

例如,在声明中

return someTableAdapter.getSomeData();
拖放

someTableAdapter.getSomeData()
进入一个手表窗口,你会看到它的价值


您可以对任何表达式执行此操作。

有许多变通方法,但似乎没有一种是令人满意的

下面引用John Skeet的话(对现已删除的答案的评论):

我还是觉得不方便- 特别是如果你不知道是哪个 返回您需要的值 在开始调试之前。我真的 我不想有一个临时的 变量使我的代码每天都乱七八糟 我什么时候还回来

理论上,调试器可以有一个
返回
-变量。毕竟:它只是堆栈上的一个变量:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

考虑这是VisualStudio的一个特性请求。

< P>微软Visual C++用于此,但VisualStudio不AFIAK…(

这可以在Visual Studio 2013中使用CLR 4.5.1完成。在以前的C#版本中不可用

(VisualStudio2008和更早版本支持VB.NET。C/C++开发人员始终可以使用它。)

如果您转到菜单工具→ 选项、IntelliTrace和更改设置以收集事件和呼叫信息

您可以返回到上一个调用事件(Ctrl+Shift+F11),并在autos窗口中查看从方法调用返回的临时值作为方法名称的子级

这不会显示所使用方法的返回值。它只显示当前方法中调用的最后一个方法的返回值

所以,这对我来说很好

DataTable go(){return someTableAdapter.getSomeData();}
它显示了
someTableAdapter.getSomeData()的返回值

但不是为了:

int go(){return 100 * 99;}

我同意这是一件非常有用的事情:不仅要在退出方法之前看到方法的返回值,还要看到我刚刚跳过的方法的返回值。我将其作为Visual Studio商业扩展名为“”的一部分实现

使用它,您可以在代码编辑器上查看方法返回值,类似于HUD显示:


有关详细信息,请参阅。

根据Microsoft的说法,无法使用托管代码可靠地实现这一点。这是他们意识到并正在解决的问题:

对于那些有经验调试C++或VB6代码的人来说,你可能已经使用了一个在自动窗口中为你提供函数返回值的特性。不幸的是,这个功能不存在于托管代码中。方便,因为它需要修改您的代码。 在托管代码中,确定您跳过的函数的返回值要复杂得多。我们意识到,我们在这里无法始终如一地执行正确的操作,因此我们删除了该功能,而不是在调试器中为您提供错误的结果。但是,我们希望为您提供此功能,我们的CLR和调试器团队正在寻找ng正在寻找解决此问题的一些潜在解决方案。不幸的是,这不是Visual Studio 11的一部分


以前.NET时代的老把戏:打开寄存器窗口,查看EAX寄存器的值。这包含上次调用的函数的返回值。

我认为您可以通过查看寄存器窗口(调试/窗口/寄存器)中的RAX寄存器来确定这一点。退出后(SHIFT+F11)在函数中,检查RAX寄存器。我不知道有什么事实,但有一天你可以检查一个寄存器(在.NET之前的日子)并查看返回值。它甚至可能是RAX和RBX的组合,等等。

是的,切换到VB.NET。;p(你刚才说的是“Visual Studio”。)

从我记事起(从Visual Basic到
Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30