如何在调试时获得返回值?

时间:2013-03-04 22:20:19

标签: c# visual-studio debugging visual-studio-2012 visual-studio-debugging

我看了看但却找不到答案,我确定它在那里但是......?

在调试时,如果我在其上放置断点,如何获取return语句的值?我喜欢凝聚成一条线,只是看起来很漂亮。但我目前没有,因为我无法弄清楚如何调试返回的结果......?

using (IUnitOfWork context = new EFUnitOfWork())
{
    var repo = new ReportRepository(context);
    return repo.GetProcedureReport(startDate, endDate).ToList();
    //return result.ToList();
}

3 个答案:

答案 0 :(得分:14)

在VS 2013中,您可以将变量$ ReturnValue添加到手表中。它包含函数的实际返回值。

答案 1 :(得分:4)

选择方法并右键单击。从菜单中选择Quickwatch。

enter image description here

我假设你不能在GetProcedureReport内设置断点?

答案 2 :(得分:4)

使用C#等托管语言无法实现您尝试的返回值调试类型。 C ++调试器通过autos窗口提供此信息,但不提供托管语言。

主要原因是CLR调试引擎根本不提供此值。对于C#,VB或F#来提供这个,他们需要重写每个return语句以将值溢出到临时值然后返回临时值。然后可以通过在调试器中显示临时值来实现返回值调试。

var returnTemp = repo.GetProcedureReport(startDate, endDate).ToList();
return returnTemp;

这可行,但它会给代码带来负面影响。最值得注意的是,大结构值最终会被复制两次并对性能产生负面影响。此外,这种重写需要在编译时进行,并且会影响正在编译的每个方法。如果可以在调试时按需完成,那么影响会小得多。这些消极因素只是权衡了这里的好处。

请注意,VB.Net确实在很小程度上提供了返回值调试。我在博客上写了这是如何运作的

  

http://blogs.msdn.com/b/jaredpar/archive/2011/01/12/why-the-debugging-difference-between-c-and-vb-net-return-values.aspx