web-dev-qa-db-ja.com

StringBuilder.AppendLine / string.FormatとStringBuilder.AppendFormatをいつ使用しますか?

最近の 質問が出ました 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"));
57
Neil Barnwell

私はAppendFormatの後にAppendLineが続くことを、読みやすさだけでなく、AppendLine(string.Format(...))を呼び出すよりもパフォーマンスが高いと見なしています。

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

61
Jon Skeet

拡張メソッドを作成するだけです。

_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つを追加するだけです。

13
docmanhattan

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();
}
11
AdamSane

パフォーマンスが重要な場合は、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"が文字列リテラルでない場合、これはより理にかなっています)

2
Chris

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

0
Brian Genisio

私はこの構造を好む:

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

確かに、改行を分離するために言うべきことがあります。

0
Joel Coehoorn

単に使用するのは積極的にひどいですか

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

?つまり、プラットフォームに依存しないことなどはわかっていますが、10ケース中9ケースで問題が解決されます。

0
Coderer