In .NET kann ich beide \r
oder \n
Zeichenfolgenliterale bereitstellen , aber gibt es eine Möglichkeit, Sonderzeichen wie " Environment.NewLine
statische Eigenschaft " einzufügen ?
In .NET kann ich beide \r
oder \n
Zeichenfolgenliterale bereitstellen , aber gibt es eine Möglichkeit, Sonderzeichen wie " Environment.NewLine
statische Eigenschaft " einzufügen ?
Antworten:
Nun, einfache Optionen sind:
string.Format
::
string x = string.Format("first line{0}second line", Environment.NewLine);
String-Verkettung:
string x = "first line" + Environment.NewLine + "second line";
String-Interpolation (in C # 6 und höher):
string x = $"first line{Environment.NewLine}second line";
Sie können \ n auch überall verwenden und ersetzen:
string x = "first line\nsecond line\nthird line".Replace("\n",
Environment.NewLine);
Beachten Sie, dass Sie dies nicht als Zeichenfolgenkonstante festlegen können , da der Wert von Environment.NewLine
nur zur Ausführungszeit verfügbar ist.
Environment.NewLine
? Im Gegenteil, es ist eine gute Praxis, es zu verwenden
Wenn Sie eine const-Zeichenfolge möchten, die Environment.NewLine enthält, können Sie Folgendes tun:
const string stringWithNewLine =
@"first line
second line
third line";
Da dies eine konstante Zeichenfolge ist, erfolgt dies in der Kompilierungszeit. Daher interpretiert der Compiler eine neue Zeile. Ich kann anscheinend keine Referenz finden, die dieses Verhalten erklärt, aber ich kann beweisen, dass es wie beabsichtigt funktioniert. Ich habe diesen Code sowohl unter Windows als auch unter Ubuntu (mit Mono) kompiliert und dann zerlegt. Dies sind die Ergebnisse:
Wie Sie sehen können, werden Zeilenumbrüche in Windows als \ r \ n und unter Ubuntu als \ n interpretiert
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();
first + Environment.NewLine + second
was effizienter und (IMO) einfacher zu lesen ist?
String.Format
das würde 1 String auf einmal erzeugen (aber intern ist es aufgrund kulturspezifischer Verkettungen usw. etwas langsam), während die String-Verkettung - 1 resultierend + 1 temporär, richtig?
String.Concatenate
, wodurch direkt nur eine Ausgabezeichenfolge erstellt wird (IIRC, wenn die Zeichenfolgen Literale sind, erfolgt die Verkettung im Compiler.
"a"+b+"c"+d
usw.) nach Leistung sind gleich einer einzigen? Oder einfach nur umgebaut String.Concatenate(a,b,c,d,etc)
, oder?
string.Format
im Kommentar nicht vorgeschlagen. Die Zeichenfolgenverkettung erzeugt keine temporären Zeichenfolgen, da der Compiler aufruft string.Concat(first, Environment.NewLine, second)
.
Eine weitere Möglichkeit zur bequemen Platzierung von Environment.NewLine in Formatzeichenfolgen. Die Idee ist, eine String-Erweiterungsmethode zu erstellen, die den String wie gewohnt formatiert, aber auch {nl} im Text durch Environment.NewLine ersetzt
Verwendung
" X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
gives:
X=1
Y=2
X+Y=3
Code
///<summary>
/// Use "string".FormatIt(...) instead of string.Format("string, ...)
/// Use {nl} in text to insert Environment.NewLine
///</summary>
///<exception cref="ArgumentNullException">If format is null</exception>
[StringFormatMethod("format")]
public static string FormatIt(this string format, params object[] args)
{
if (format == null) throw new ArgumentNullException("format");
return string.Format(format.Replace("{nl}", Environment.NewLine), args);
}
Hinweis
Wenn ReSharper Ihre Parameter hervorheben soll, fügen Sie der obigen Methode ein Attribut hinzu
[StringFormatMethod ("Format")]
Diese Implementierung ist offensichtlich weniger effizient als nur String.Format
Vielleicht interessiert sich einer, der sich für diese Frage interessiert, auch für die nächste Frage: Benannte Zeichenfolgenformatierung in C #
string myText =
@"<div class=""firstLine""></div>
<div class=""secondLine""></div>
<div class=""thirdLine""></div>";
das ist es nicht:
string myText =
@"<div class=\"firstLine\"></div>
<div class=\"secondLine\"></div>
<div class=\"thirdLine\"></div>";
static class MyClass
{
public const string NewLine="\n";
}
string x = "first line" + MyClass.NewLine + "second line"
Environment.NewLine
- siehe die anderen Antworten.
const string
In neueren .net-Versionen können Sie $ vor dem Literal verwenden, wodurch Sie Variablen wie folgt verwenden können:
var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
Wenn Sie die New Line-Zeichenfolge wirklich als Konstante möchten, können Sie Folgendes tun:
public readonly string myVar = Environment.NewLine;
Der Benutzer des schreibgeschützten Schlüsselworts in C # bedeutet, dass diese Variable nur einmal zugewiesen werden kann. Die Dokumentation dazu finden Sie hier . Es ermöglicht die Deklaration einer konstanten Variablen, deren Wert erst zur Ausführungszeit bekannt ist.
Wenn Sie mit einer Webanwendung arbeiten, können Sie dies versuchen.
StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")
Wenn ich die Frage verstehe: Paar "\r\n"
, um diese neue Zeile unten in a zu bekommen textbox
. Mein Beispiel hat funktioniert -
string s1 = comboBox1.Text; // s1 is the variable assigned to box 1, etc.
string s2 = comboBox2.Text;
string both = s1 + "\r\n" + s2;
textBox1.Text = both;
Eine typische Antwort könnte s1
s2
die text box
Verwendung eines definierten Typstils sein.