web-dev-qa-db-ja.com

String.FormatとToString()

次のいずれかの方法でメリットがあるかどうかを誰かが説明できますか?

decimal d = 12.0m;

// 1. how I'd have done it
myLabel.Text = d.ToString();

// 2. how I saw someone do it today
myLabel.Text = String.Format("{0}", d);

明確にするために、私はメソッドが何をするのかを照会していません。この特定の例で一方が他方よりもパフォーマンス上の利点がある場合でも、明らかに満足しています。 string.format()によって提供されるカルチャとフォーマットの柔軟性が追加されていることは知っていますが、ラベルまたは一般的なテキストベースのプロパティに値を添付するには、常に「tostring()」数値を使用します。

私には、string.format()オプションは、ここでは追加の利点がないため、より多くの入力をしているように見えますが、一方の方法と他方の方法で物事を行うことの「内部」の利点は他にあるのではないかと思いました。

16
dougajmcdonald

Linqpadで少しベンチマークを行いました。

void Main()
{
    int iterations = 1000000;
    decimal d = 12.0m;
    var text = "";

    var sw = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        // 1. how I'd have done it
        text = d.ToString();
    }
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("ToString()");

    sw = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        // 2. how I saw someone do it today
        text = String.Format("{0}", d);
    }
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("Format");
}

ToString()157

フォーマット264

ToString()は一貫して高速に見えます。

編集:私のPCでは1000万の「フォーマット」操作は2.2秒しかかからなかったことを指摘する必要があります。これはマイクロ最適化に非常によく似ており、実行していることが非常にパフォーマンスが重要であるか反復的でない限り、これについてあまり心配する必要はありません。

28
Dave Bish

ToString()はとにかく内部でFormat()を呼び出す必要があるため、ToString()の方が優れています。カスタムフォーマットを指定する必要がある場合、Format()は配置/パディングなどのフォーマット指定子を提供します。それ以外の場合は、ToString()を使用しない理由はありません。

ToString()は、Format()よりも自己文書化コードにはるかによく適合し、より理にかなっています。

3
Kendall Frey

文字列形式-内部で使用-StringBuilder-文字列の操作がはるかに高速です。

ToStringは、オブジェクトのデフォルト表現です。

3
Royi Namir

string.Formatは、params引数セットを取ることができるため、他の複雑な文字列の作成に使用できます。ですから、これは実際にはリンゴとリンゴの問題ではありません。

3
Tejs

フォーマット文字列を解析する必要がないため、ToString()を呼び出すことによるパフォーマンス上のメリットはわずかであると思います。それで、Format()の機能の機能を使用していない場合は、はるかに読みやすくなります。

1
Tim Rogers