Ich frage mich, was ist die "beste Praxis" zu brechen lange Zeichenfolgen in C#-Quellcode. Ist diese Zeichenfolge
"string1"+
"string2"+
"string3"
während der Kompilierung oder während der Laufzeit verkettet?
Ich frage mich, was ist die "beste Praxis" zu brechen lange Zeichenfolgen in C#-Quellcode. Ist diese Zeichenfolge
"string1"+
"string2"+
"string3"
während der Kompilierung oder während der Laufzeit verkettet?
Das geschieht zur Kompilierzeit. Das ist genau gleich wie "string1string2string3".
Angenommen, Sie haben:
string x = "string1string2string3"
string y = "string1" + "string2" + "string3"
Der Compiler führt ein entsprechendes Interning durch, so dass x und y auf die gleichen Objekte verweisen.
EDIT: Es gibt eine Menge Gerede über StringBuilder
in den Antworten und Kommentaren. Viele Entwickler scheinen zu glauben, dass die String-Verkettung immer getan werden mit StringBuilder
. Das ist eine Verallgemeinerung - es lohnt sich, sie zu verstehen pourquoi StringBuilder
ist in manchen Situationen gut, in anderen nicht .
Wenn der Leerraum nicht wichtig ist, können Sie das Escape-Zeichen @ verwenden, um mehrzeilige Zeichenketten in Ihrem Code zu schreiben. Dies ist zum Beispiel nützlich, wenn Sie eine Abfrage in Ihrem Code haben:
string query = @"SELECT whatever
FROM tableName
WHERE column = 1";
Dadurch erhalten Sie eine Zeichenkette mit Zeilenumbrüchen und Tabulatoren, aber für eine Abfrage spielt das keine Rolle.
Ihr Beispiel wird zur Kompilierzeit verkettet. Alle Inline-Strings und const-String-Variablen werden zur Kompilierungszeit verkettet.
Zu beachten ist, dass das Einfügen von schreibgeschützten Zeichenketten die Verknüpfung zur Laufzeit verzögert. string.Empty und Environment.NewLine sind beides schreibgeschützte String-Variablen.
Wie wäre es mit folgendem Erweiterungsmethode (inspiriert von common-tags oneLine Methode)...
using System;
using System.Text.RegularExpressions;
using static System.Text.RegularExpressions.RegexOptions;
namespace My.Name.Space
{
public static class StringHelper
{
public static string AsOneLine(this string text, string separator = " ")
{
return new Regex(@"(?:\n(?:\s*))+").Replace(text, separator).Trim();
}
}
}
...in Kombination mit dem wortwörtliches String-Wort als solche verwendet:
var mySingleLineText = @"
If we wish to count lines of code, we should not regard them
as 'lines produced' but as 'lines spent'.
".AsOneLine();
Beachten Sie, dass z. B. Leerzeichen "innerhalb" der Zeichenkette erhalten bleiben:
// foo bar hello world.
var mySingleLineText = @"
foo bar
hello world.
".AsOneLine();
Wenn Sie nicht möchten, dass Zeilenumbrüche durch Leerzeichen ersetzt werden, dann übergeben Sie ""
als Argument für die Erweiterungsmethode:
// foobar
var mySingleLineText = @"
foo
bar
".AsOneLine("");
Bitte beachten Sie: Diese Form der String-Konkatenation wird aufgrund der involvierten Helper-Methode zur Laufzeit durchgeführt (im Gegensatz zur Konkatenation über die +
Operator, der zur Kompilierzeit auftritt, wie auch in der akzeptierten Antwort angegeben). Wenn also die Leistung ein Thema ist, sollten Sie die +
. Wenn Sie es mit langen Sätzen zu tun haben und die Lesbarkeit und "Benutzerfreundlichkeit" im Vordergrund stehen, dann ist der oben vorgeschlagene Ansatz vielleicht eine Überlegung wert.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.