具有以下功能:
DataTable go() {
return someTableAdapter.getSomeData();
}
当我在此函数中设置断点时,是否有可能检查返回的值?go()
直接耦合到.aspx
页面中的数据网格。
检查返回的数据表的唯一方法是使用临时变量。但是,这有点不方便。有没有其他办法?
具有以下功能:
DataTable go() {
return someTableAdapter.getSomeData();
}
当我在此函数中设置断点时,是否有可能检查返回的值?go()
直接耦合到.aspx
页面中的数据网格。
检查返回的数据表的唯一方法是使用临时变量。但是,这有点不方便。有没有其他办法?
Answers:
从来没听说过。请注意,如果您确实添加了一个变量,则无论如何它都会在发行版中被编译器删除...
更新:
此功能已添加到VS2013中。您可以在自动窗口中查看返回值,也可以$ReturnValue
在监视/立即窗口中使用返回值。
仅在从函数返回后才能直接看到该值,因此访问它的最简单方法是在函数调用上放置一个断点并跳过(F10)调用。
VS2015更新:嘘!不幸的是,它似乎不在VS2015的VS2015(devenv v14)
更新中:它回来了。(devenv v15)
根据客户反馈网站,这可以在带有CLR 4.5.1的Visual Studio 2013中完成。在C#的早期版本中不可用。
(Visual Studio 2008和更早版本的VB.NET支持它。C/ C ++开发人员一直可以使用。)
根据Microsoft的说法,无法使用托管代码可靠地实现此目的。这是他们意识到并正在解决的问题:
对于那些有调试本机C ++或VB6代码经验的人,您可能使用了在“自动”窗口中为您提供函数返回值的功能。不幸的是,托管代码不存在此功能。尽管您可以通过将返回值分配给局部变量来解决此问题,但这并不方便,因为它需要修改您的代码。在托管代码中,确定您跨过的函数的返回值要麻烦得多。我们意识到在这里无法始终如一地做正确的事情,因此我们删除了该功能,而不是在调试器中给您错误的结果。但是,我们希望为您带来帮助,我们的CLR和Debugger团队正在寻找解决此问题的许多潜在解决方案。不幸的是,这将不属于Visual Studio 11。
关于Visual Studio 2015:
根据Marc Gravell当前接受的答案:
此功能已添加到Visual Studio 2013中。您可以在汽车窗口中查看返回值,也可以在监视/立即窗口中使用$ ReturnValue
该答案还表明,此功能在Visual Studio 2015中不起作用。(并非完全如此)这不是事实。在检查方法调用的返回值时,有以下注意事项:
您必须打开旧式表达式评估器才能识别$ ReturnValue (工具/选项/调试/使用旧式C#和VB表达式评估器)。否则,您可以使用$ ReturnValue1。
我在Visual Studio 2015 Enterprise中对此进行了测试:
$ReturnValue
可以工作。但是,如果Use managed compatibility mode
启用了调试选项,则返回值不会出现在任何地方。
如果转到菜单工具 → 选项,IntelliTrace,然后更改设置以收集事件和呼叫信息。
您可以返回到上一个调用事件(Ctrl+ Shift+ F11),并在autos窗口中查看从方法调用返回的临时值,作为方法名称的子代。
这并没有显示您所使用方法的返回值。它只是显示了当前方法中调用的最后一个方法的返回值。
所以,这对
DataTable go(){return someTableAdapter.getSomeData();}
因为它显示了的返回值someTableAdapter.getSomeData()
。
但不适用于:
int go(){return 100 * 99;}
使用Shift-F11退出go()方法,然后在“自动”调试窗口中显示刚刚从堆栈弹出的方法调用的返回值(在这种情况下,go()方法为你想要什么)。这是Visual Studio 2005中的行为。我没有使用过Visual Studio 2008,所以我不知道它在该版本中的行为是否相同。
是的,有一个非常好的方法。一个重大的缺点是您必须等待5到6年。由于我看到您是在2008年11月发布的,因此建议您waaaaaa ...
... aaaait。和瞧!MS仅针对您发布了最新的Visual Studio 2013,它是在调试模式下运行时从菜单中可访问的默认功能(菜单Debug → Windows → Autos)。
有很多变通办法,但似乎都不令人满意。
在下面引用John Skeet(评论已删除的答案):
仍然给我带来不便-特别是如果您在开始调试之前不知道需要哪个返回值。我真的不想每次我返回任何东西时都必须有一个临时变量使我的代码混乱。
从理论上讲,调试器可以具有return
-variable。毕竟:这只是堆栈上的一个变量:
unsafe {
int * sp = stackalloc int[1];
try {
return a+b;
}
finally {
Trace.WriteLine("return is " + *(sp+3));
}
}
因此,请考虑将其作为Visual Studio的功能请求。
我想扩展PascalK的答案,以使其在Visual Studio 2015中工作,因为有一个隐藏的功能未在“ 检查方法调用的返回值”中进行记录。
如果您具有嵌套的函数调用,$ResultValueX
则会自动创建伪变量,其中X表示函数调用顺序。因此,如果您有诸如这样的调用Multiply(Five(), Six())
,则会创建以下伪变量:
Five() | $ResultValue1 = 5
Six() | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30
我知道的唯一方法是在返回行上放置一个断点,然后调用“ 快速监视”窗口并输入返回的表达式:
someTableAdapter.getSomeData();
但这仅在调用不更改任何对象的状态的情况下才有效(因为当您恢复执行时将再次调用同一方法)。
打开“调试”→“自动”窗口,即可关闭。它不会显示实际的返回值,但是会显示在return语句中评估的内容。
return x + y;
我的意思是,如果您在此行上设置断点,则Debug-Autos窗口将显示x和y的当前值。就像我说的,只有你靠近你。只是想有所帮助。我认为这不应该被否决。
是的,通过切换到VB.NET。; P(您刚才说的是“ Visual Studio”。)
只要我能记住(从Visual Basic到VB.NET的所有版本),您都可以简单地查询函数名称。它像局部变量一样在函数的“函数”中隐式声明,该变量在函数的开始处隐含声明,并且当函数通过非返回语句(例如,Exit Function
或者只是掉进去)退出时(当然,当函数退出时),其当前值也用作返回值。使用return语句。
它还设置为return语句的表达式。就像局部变量一样,可以在函数内部的任何执行点(包括执行return语句之后)检查其值。C#没有,应该。
VB.NET的那个小功能(加上Exit Function
它启用的语句-C#没有并且应该有的另一个功能)以防御性编程的形式非常有用,我在实践中始终将函数名称初始化为failure / default值,例如第一个陈述。然后,在任何故障点(通常比成功点发生的频率要高得多),我可以简单地调用该Exit Function
语句(即,无需重复故障/默认表达式甚至是常量/变量名称)。
可接受的答案不适用于Visual Studio 2015,但是通过在方法的最后一行放置一个断点并按F10,它将把返回值的所有表达式放入本地窗口。
您可以尝试选择"someTableAdapter.getSomeData();"
,右键单击它,然后选择快速观看。