Visual Studio在调试期间如何显示System.Double?
尝试调试以下简单程序,并在每个步骤中将鼠标hover在x
上(或者为x
或其他任何内容添加“添加监视”)。
using System; using System.Globalization; static class Program { static double x; static void Main() { x = 2d; // now debugger shows "2.0", as if it has used // x.ToString("F1", CultureInfo.InvariantCulture) x = 8.0 / 7.0; // now debugger shows "1.1428571428571428", as if it had used // x.ToString("R", CultureInfo.InvariantCulture) // Note that 17 significant figures are shown, not the usual 15. x = -1e-200 / 1e200; // now debugger shows "0.0"; there is no indication that this is really negative zero // Console.WriteLine(1.0 / x); // this is negative infinity } }
所以,显然VS有自己的方式来显示System.Double
。 它为此目的采用了哪种方法? 有没有办法我可以编程方式获得相同的字符串表示?
(使用Visual Studio 2010 Professional尝试过这一点。)
C#和VB.Net EE的核心是使用_ecvt_s
函数将double
格式化为字符串。
两者都对结果字符串进行了一些清理,以使显示更多C#和VB之类,并处理一些角点情况更好一些。 _ecvt_s
函数或清理代码可能会导致您看到的差异。 很难一目了然
有些人可能会问为什么我们会经历所有这些麻烦而不是只是在值上调用ToString
并显示它。 有几个原因我们不这样做。
首先,function评估,甚至ToString
,是EE可以采取的最昂贵的行动。 常见真实场景的概况表明,我们98%以上的时间都花在了function评估上。 任何时候我们都可以避免使用function因为性能影响。
第二个原因很简单,function评估并不总是可用的。 有很多情况下func eval不可用但人们仍然期望看到原始类型的显示,如double
, int
等等……将它们拿走会基本上破坏调试体验。 因此,我们需要在没有ToString
支持的情况下解决此问题。
我将接受JaredPar的回答,因为它描述了调试器内部的工作原理。
但是因为答案无法获得相同的字符串,所以这里有一些代码经常(总是?)给出相同的字符串:
static string ToDebugString(this double d) { if (Double.IsNaN(d) || Double.IsInfinity(d)) return d.ToString(CultureInfo.InvariantCulture); string s = d.ToString("R", CultureInfo.InvariantCulture); if (!s.Contains(".")) s += ".0"; return s; }
请随时改进这个答案。