60

String.Format()の使用に関する最近の質問がありました。私の答えの一部には、StringBuilder.AppendLine(string.Format(...))を使用するための提案が含まれていました。Jon Skeetは、これは悪い例であると提案し、AppendLineとAppendFormatの組み合わせを使用して提案しました。

これらの方法を使用するための「好ましい」アプローチに自分自身を実際に落ち着かせたことは一度もありませんでした。次のようなものを使い始めるかもしれませんが、他の人が「ベストプラクティス」として何を使用しているかを知りたいと思います。

sbuilder.AppendFormat("{0} line", "First").AppendLine();
sbuilder.AppendFormat("{0} line", "Second").AppendLine();

// as opposed to:

sbuilder.AppendLine( String.Format( "{0} line", "First"));
sbuilder.AppendLine( String.Format( "{0} line", "Second"));
4

7 に答える 7

65

AppendFormat続いてAppendLine、を呼び出すよりも読みやすいだけでなく、パフォーマンスも高いと考えていますAppendLine(string.Format(...))

後者はまったく新しい文字列を作成し、それを既存のビルダーに大規模に追加します。「なぜStringBuilderを使うのが面倒なのか」というところまでは行きません。しかし、それはStringBuilderの精神に少し反しているように見えます。

于 2008-12-08T14:37:25.377 に答える
11

String.format は StringBuilder オブジェクトを内部的に作成します。することで

sbuilder.AppendLine( String.Format( "{0} line", "First"));

文字列ビルダーの追加のインスタンスが作成され、そのすべてのオーバーヘッドが作成されます。


mscorlib、Commonlauageruntimelibary、System.String.Format のリフレクター

public static string Format(IFormatProvider provider, string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
    StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
    builder.AppendFormat(provider, format, args);
    return builder.ToString();
}
于 2008-12-08T18:55:05.420 に答える
2

パフォーマンスが重要な場合は、AppendFormat() を完全に避けるようにしてください。代わりに複数の Append() または AppendLine() 呼び出しを使用してください。これにより、コードが大きくなり、読みにくくなりますが、文字列の解析を行う必要がないため、高速になります。文字列の解析は想像以上に遅いです。

私は一般的に使用します:

sbuilder.AppendFormat("{0} line", "First");
sbuilder.AppendLine();
sbuilder.AppendFormat("{0} line", "Second");
sbuilder.AppendLine();

パフォーマンスが重要でない限り、その場合は次を使用します。

sbuilder.Append("First");
sbuilder.AppendLine(" line");
sbuilder.Append("Second");
sbuilder.AppendLine(" line");

(もちろん、"First" と "Second" が文字列リテラルでない場合、これはより理にかなっています)

于 2008-12-08T17:46:22.640 に答える
0

AppendFormat()は、AppendLine(String.Format())よりもはるかに読みやすくなっています。

于 2008-12-08T14:37:37.343 に答える
0

私はこの構造を好みます:

sbuilder.AppendFormat("{0} line\n", "First");

確かに、改行を分離するために言わなければならないことがあります。

于 2008-12-08T14:49:47.617 に答える
0

単に使用するのは本当にひどいですか

sbuilder.AppendFormat("{0} line\n", first);

? つまり、プラットフォームに依存しないなどというわけではないことはわかっていますが、10 件中 9 件のケースで仕事が完了します。

于 2008-12-08T14:53:15.253 に答える