Visual Studio 在调试期间如何显示 System.Double
本文关键字:显示 Double System 何显示 Studio 调试 Visual | 更新日期: 2023-09-27 18:31:45
尝试调试以下简单程序,并在每个步骤中将鼠标悬停在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
格式化为字符串。
- http://msdn.microsoft.com/en-us/library/ehz2dset(v=vs.80).aspx
两者都对生成的字符串进行了一些清理,以使显示更像 C# 和 VB,并更好地处理一些极端情况。 _ecvt_s
函数或清理代码可能是您看到的差异的原因。 一目了然很难分辨
有些人可能会问,为什么我们要经历所有这些麻烦,而不是说只是调用ToString
值并显示它。 我们不这样做有几个原因。
首先,函数评估,即使是ToString
,也是EE可以采取的最昂贵的操作。 常见真实场景的概况显示,我们超过 98% 的时间都花在了功能评估上。 任何时候我们都可以避免由于性能影响而进行的函数评估。
第二个原因很简单,函数评估并不总是可用的。在许多情况下,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;
}
请随时改进此答案。
<小时 />编辑:这是一篇旧文章,处理ToString
,因为它在.NET Framework和.NET Core中(是)直到2.2。从 2019 年的 .NET Core 3.0 开始,继续在 .NET 5、.NET 6、.NET 7 等中,ToString
的行为发生了很大变化。