45 Stimmen

Der beste Weg, um lange Zeichenfolgen in C#-Quellcode zu unterbrechen

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?

58voto

Jon Skeet Punkte 1325502

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 .

45voto

Rune Grimstad Punkte 34670

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.

8voto

James Newton-King Punkte 46367

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.

5voto

B12Toaster Punkte 11390

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.

4voto

Maxam Punkte 4005

Die Verkettung wird zur Kompilierzeit durchgeführt, so dass kein Laufzeit-Overhead entsteht.

CodeJaeger.com

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.

Powered by:

X