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中尝试过。

Visual Studio 在调试期间如何显示 System.Double

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 不可用,但人们仍然希望看到原始类型的显示,如 doubleint 等......将它们拿走基本上会扼杀调试体验。 因此,我们需要在没有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的行为发生了很大变化。