it-swarm.com.de

Die beste Möglichkeit, lange Zeichenfolgen in C # -Quellcode zu brechen

Ich frage mich, was ist die "beste Methode", um lange Zeichenfolgen in C # -Quellcode zu brechen. Ist diese Zeichenfolge? 

"string1"+
"string2"+
"string3"

beim Kompilieren oder zur Laufzeit verkettet?

35

Es ist zur Kompilierzeit erledigt. Das entspricht genau "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 dieselben Objekte verweisen.

BEARBEITEN: In den Antworten und Kommentaren wird viel über StringBuilder gesprochen. Viele Entwickler scheinen zu glauben, dass String-Verkettung always mit StringBuilder erfolgen sollte. Das ist eine Übergeneralisierung - es lohnt sich zu verstehen warum StringBuilder in manchen Situationen gut ist und nicht in anderen .

49
Jon Skeet

Wenn das Leerzeichen nicht wichtig ist, können Sie mit dem @ -Escape-Zeichen mehrzeilige Zeichenfolgen in Ihren Code schreiben. Dies ist nützlich, wenn Sie eine Abfrage in Ihrem Code haben, zum Beispiel:

string query = @"SELECT whatever
FROM tableName
WHERE column = 1";

Dadurch erhalten Sie eine Zeichenfolge mit Zeilenumbrüchen und Tabulatoren. Für eine Abfrage ist das jedoch unerheblich.

39
Rune Grimstad

Ihr Beispiel wird zur Kompilierzeit verkettet. Alle Inline-Strings und Const-String-Variablen werden zur Kompilierzeit verkettet.

Dabei ist zu beachten, dass das Einschließen von Readonly-Strings die Laufzeit auf die Laufzeit beschränkt. string.Empty und Environment.NewLine sind beide nur lesbare Stringvariablen.

7

Die Verkettung erfolgt zur Kompilierzeit, sodass kein Laufzeitaufwand entsteht.

3
Maxam

es hängt wirklich davon ab, was Sie brauchen. Wenn Sie Strings miteinander vergleichen müssen, wird die beste Leistung in Runtime durch die Verwendung von StringBuilder erzielt. Wenn Sie im Quellcode etwas wie var str = "String1" + "String2" referenzieren, wird der Konverter verwendet in string str = "String1String2" beim Kompilieren. In diesem Fall haben Sie keinen Verkettungsaufwand

1
Tamir

StringBuilder ist ein guter Weg, wenn Sie viele (mehr als vier) Zeichenfolgen haben, die verkettet werden sollen. Es ist schneller.

Die Verwendung von String.Concat in Ihrem obigen Beispiel erfolgt zur Kompilierzeit. Da es sich um Literal-Strings handelt, werden sie vom Compiler optimiert.

Wenn Sie jedoch Variablen verwenden:

string a = "string1";
string b = "string2";
string c = a + b;

Dies geschieht zur Laufzeit.

1

Können Sie keine StringBuilder verwenden? 

0
Damien

Wie wäre es mit der folgenden Erweiterungsmethode (die von den Common-Tags oneLine -Methode inspiriert ist) ...

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 verbatim-String-Literal als solches 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 Leerzeichen "innerhalb" der Zeichenfolge erhalten bleiben, zum Beispiel:

// foo      bar hello        world.
var mySingleLineText = @"
    foo      bar
    hello        world.
".AsOneLine();

Wenn Sie nicht möchten, dass Zeilenumbrüche durch Leerzeichen ersetzt werden, übergeben Sie "" als Argument an die Erweiterungsmethode:

// foobar
var mySingleLineText = @"
    foo
    bar
".AsOneLine("");

Bitte beachten Sie: Diese Form der String-Verkettung wird aufgrund der verwendeten Helper-Methode zur Laufzeit ausgeführt (im Gegensatz zur Verkettung über den +-Operator, der zur Kompilierzeit auftritt, wie auch in der akzeptierten Antwort angegeben). Wenn also Leistung ein Problem ist, fahren Sie mit dem + fort. Wenn Sie mit langen Sätzen zu tun haben und die Lesbarkeit im Vordergrund steht, sollte der oben vorgeschlagene Ansatz eine Überlegung wert sein.

0
B12Toaster

Es gibt eine Möglichkeit, dies zu tun. Mein Favorit verwendet die Methode eines Strings aus C #. Beispiel 1:

string s = string.Format ("{0} {1} {0}", "Hello", "By"); Ergebnis ist s = "Hello By Hello";

0
Eduardo