最近の 質問が出ました 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"));
私はAppendFormat
の後にAppendLine
が続くことを、読みやすさだけでなく、AppendLine(string.Format(...))
を呼び出すよりもパフォーマンスが高いと見なしています。
後者は、まったく新しい文字列を作成し、それを既存のビルダーに追加します。 「それでは、なぜStringBuilderを使うのが面倒なのですか?」と言うことはしません。しかし、StringBuilderの精神に少し反するように見えます。
拡張メソッドを作成するだけです。
_public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args)
{
builder.AppendFormat(format, args).AppendLine();
return builder;
}
_
私がこれを好む理由:
AppendLine(string.Format(...))
ほどオーバーヘッドはかかりません。.AppendLine()
パーツを追加するのを忘れないようにします(頻繁に発生します)。「AppendLine」と呼ばれたくない場合は、「AppendFormattedLine」または必要なものに変更できます。私は 'AppendLine'への他の呼び出しと並んですべてを楽しんでいます:
_var builder = new StringBuilder();
builder
.AppendLine("This is a test.")
.AppendLine("This is a {0}.", "test");
_
StringBuilderでAppendFormatメソッドを使用するオーバーロードごとにこれらの1つを追加するだけです。
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();
}
パフォーマンスが重要な場合は、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"が文字列リテラルでない場合、これはより理にかなっています)
AppendFormat()は、AppendLine(String.Format())よりもはるかに読みやすくなっています。
私はこの構造を好む:
sbuilder.AppendFormat("{0} line\n", "First");
確かに、改行を分離するために言うべきことがあります。
単に使用するのは積極的にひどいですか
sbuilder.AppendFormat("{0} line\n", first);
?つまり、プラットフォームに依存しないことなどはわかっていますが、10ケース中9ケースで問題が解決されます。