Frage

Eine aktuelle Frage kam über die Verwendung von String.Format (). Ein Teil meiner Antwort enthalten einen Vorschlag StringBuilder.AppendLine (string.Format (...)) zu verwenden. Jon Skeet schlug dies war ein schlechtes Beispiel und schlug eine Kombination aus AppendLine und AppendFormat verwendet wird.

Es kam mir habe ich nie wirklich selbst ließ sich in einer „bevorzugten“ Ansatz für den Einsatz dieser Methoden. Ich glaube, ich könnte mit so etwas wie die folgen Sie aber ist daran interessiert zu wissen, was andere Menschen als „best practice“ verwenden:

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"));
War es hilfreich?

Lösung

Ich sehe AppendFormat gefolgt von AppendLine als nicht nur lesbar, sondern auch leistungsfähiger als AppendLine(string.Format(...)) aufrufen.

Dieser schafft eine ganz neue Zeichenfolge und dann hängt es Großhandel in den bestehenden Builder. Ich werde gehen nicht so weit zu sagen: „Warum dann mit String der Mühe machen?“ aber es scheint ein wenig gegen den Geist des String.

Andere Tipps

Nur eine Erweiterungsmethode erstellen.

public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args)
{
    builder.AppendFormat(format, args).AppendLine();
    return builder;
}

Gründe Ich ziehe es so aus:

  • Ist nicht so viel Aufwand wie AppendLine(string.Format(...)) leiden, wie oben angegeben.
  • mich Verhindert, dass zu vergessen den .AppendLine() Teil am Ende (geschieht häufig genug).
  • hinzufügen
  • Ist besser lesbar (aber das ist eher eine Meinung).

Wenn Sie es nicht mögen, genannt zu werden ‚AppendLine,‘ man könnte es ändern zu ‚AppendFormattedLine‘ oder was auch immer Sie wollen. Ich genieße alles mit anderen Anrufen zu ‚AppendLine‘ Schlange aber:

var builder = new StringBuilder();

builder
    .AppendLine("This is a test.")
    .AppendLine("This is a {0}.", "test");

Sie kann einen dieser hinzuzufügen für jede Überlastung Sie auf String der AppendFormat Methode verwenden.

String.format erzeugt ein Stringbuilder-Objekt intern. Dadurch

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

eine zusätzliche Instanz von String-Builder, mit all seinem Overhead erzeugt wird.


Reflektor auf 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();
}

Wenn die Leistung wichtig ist, versuchen AppendFormat () vollständig zu vermeiden. Verwenden Sie mehrere Append () oder AppendLine () ruft statt. Das macht Ihren Code größer und weniger lesbar, aber es ist schneller, weil keine Zeichenfolgenanalyse durchgeführt werden muss. String-Parsing ist langsamer, als Sie sich vorstellen können.

ich in der Regel verwenden:

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

Es sei denn, die Leistung entscheidend ist, in diesem Fall würde ich verwenden:

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

(Natürlich ist dies würde mehr Sinn machen, wenn „First“ und „Second“, wo nicht Stringliterale)

AppendFormat () ist viel besser lesbar als AppendLine (String.Format ())

Ich ziehe diese Struktur:

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

Obwohl zugegebenermaßen gibt es etwas für Aussondern der Zeilenumbrüche gesagt werden.

Ist es nur positiv schrecklich einfach zu bedienen

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

? Ich meine, ich weiß, es ist nicht plattformunabhängig oder was auch immer, aber in 9 von 10 Fällen erhält die Arbeit erledigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top