7

次の簡単なプログラムをデバッグしてみて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で試してみました。)

4

2 に答える 2

8

コアでは、C#とVB.Net EEの両方が、 aを文字列_ecvt_sにフォーマットするための関数を使用しdoubleます。

どちらも、結果の文字列を少しクリーンアップして、表示をC#やVBのようにし、一部のコーナーケースを少し適切に処理します。関数またはクリーンアップコードのいずれかが、_ecvt_s表示される違いの原因である可能性があります。一目でわかりにくい

ToString単に価値を求めてそれを表示するのではなく、なぜこの問題をすべて経験するのかと疑問に思う人もいるかもしれません。これを行わない理由はいくつかあります。

1つ目は、機能評価は、たとえToString、EEが実行できる唯一の最も費用のかかるアクションであるということです。一般的な実際のシナリオのプロファイルは、98%以上の時間が関数評価に費やされたことを示しています。パフォーマンスに影響するため、関数評価を回避できる場合はいつでも実行します。

2つ目の理由は、関数評価が常に利用できるとは限らないということです。関数の評価が利用できない場合がいくつかありますが、人々はまだ、、などのプリミティブ型の表示を期待していますdouble...intそれらを取り除くと、本質的にデバッグエクスペリエンスが失われます。したがって、ToStringサポートなしでこの問題を解決する必要があります。

于 2012-04-20T19:01:39.800 に答える
2

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;
}

この答えを自由に改善してください。

于 2012-04-25T17:53:03.713 に答える