Wie verwende ich Escapezeichen mit String-Interpolation in C # 6?

86

Ich habe String-Interpolation verwendet und es geliebt, aber ich habe ein Problem, bei dem ich versuche, einen Backslash in meine Ausgabe aufzunehmen, aber nicht in der Lage bin, es zum Laufen zu bringen.

Was ich will ist so etwas ..

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\{userName}"

Ich möchte, dass die Ausgabe von Combo ist

myDomain\myUserName

Was ich bekomme, ist ein Syntaxfehler darüber, dass \ ein Escape-Zeichen ist. Wenn ich \\ eingebe, ist der Snytax-Fehler weg, aber die Ausgabe ist myDomain \\ myUsername

Wie kann ich maskierte Zeichen in eine interpolierte Zeichenfolge aufnehmen?

Matt
quelle
Vielen Dank. Aber dann kann ich keine String-Interpolation verwenden? Ich will nicht alles entkommen. Ich möchte nur einen Backslash innerhalb einer interpolierten Zeichenfolge verwenden.
Matt
Nein, kannst du nicht. Seine Antwort ist falsch.
Greenhoorn
3
fühlt sich für mich wie ein Käfer an;) \\ sollte funktionieren
Matt
Ich erhalte die richtige Ausgabe für $ {domain} \\ {userName}. Handelt es sich um eine Webanwendung?
Greenhoorn
2
Nhans Antwort scheint perfekt zu funktionieren. $@"{domain}\{userName}". Ich denke, du solltest es versuchen und akzeptieren. Ich hatte genau das gleiche Problem, bis hin zu Domain und Benutzername, und seine Methode funktioniert einwandfrei.
ProfK

Antworten:

101

Das Escaping mit einem Backslash ( \) funktioniert für alle Zeichen außer einer geschweiften Klammer.

Wenn Sie versuchen, einer geschweiften Klammer ( {oder }) zu entkommen , müssen Sie {{oder }}per https://msdn.microsoft.com/en-us/library/dn961160.aspx verwenden .

... Alle Vorkommen von doppelten geschweiften Klammern ("{{" und "}}") werden in eine einzelne geschweifte Klammer umgewandelt.

Vogelhändler
quelle
Es funktioniert nicht für einen Backslash selbst, wie das OP klar erklärt.
ProfK
79

Sie können dies mit beiden $ @ tun. Die Reihenfolge ist wichtig.

var combo = $@"{domain}\{userName}";
Nhan
quelle
4
Die beste und einfachste Antwort. Verstehe nicht, warum Leute kompliziertere Antworten wählen. MSDN-Link für wörtlich interpolierte Zeichenfolgen docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758
2
"Ab C # 8.0 können Sie die Token $ und @ in beliebiger Reihenfolge verwenden" (Aus Alex 'Link im obigen Kommentar).
Casey Plummer
8

Eduardo ist richtig. Sie entkommen lockigen Zahnspangen, indem Sie sich verdoppeln. Wenn Sie die Domänenvariable als {mydomain} ausgeben möchten, müssen Sie daher Folgendes tun:

$"{{{domain}}}";

Unter der Annahme, dass das aktuelle Datum der 1. September 2016 ist, gehen Sie wie folgt vor:

$"The date is {DateTime.Now}";

würde abhängig von Ihrer Lokalisierung etwas wie "Das Datum ist 01.09.2016 15:04:48" ausgeben. Sie können das Datum auch folgendermaßen formatieren:

$"The date is {DateTime.Now : MMMM dd, yyyy}";

welches "Das Datum ist der 1. September 2016" ausgeben würde. Interpolierte Zeichenfolgen sind viel besser lesbar. Gute Antwort Eduardo.

Dirk Strauss
quelle
1
Das OP versucht nicht, geschweiften Klammern zu entkommen. Sie geben eindeutig an, dass sie versuchen, einem Backslash selbst zu entkommen, und das normale `\\` funktioniert in einer interpolierten Zeichenfolge nicht.
ProfK
3
Es ist mir egal, was OP fragte, ich wollte geschweiften Klammern entkommen und der erste Google-Eintrag war dies. Die OP-Überschrift führt Google in die Irre und dies ist daher eine gültige Antwort und verdient eine Abstimmung.
AndrewBenjamin
4
$"{domain}\\{user}"

Funktioniert einwandfrei - das Entkommen funktioniert wie gewohnt (außer beim Entkommen {). Zumindest unter .NET 4.6 und VS 14.0.22823 D14REL.

Wenn es aus irgendeinem Grund nicht funktioniert (vielleicht verwenden Sie eine ältere Version des Compilers?), Können Sie auch versuchen, expliziter zu sein:

$"{domain}{@"\"}{user}"
Luaan
quelle
Das habe ich auch gedacht. Interessanterweise funktioniert der Code auf meinem Surface Pro 3 entweder mit dem normalen \\ oder dem expliziten @ "\", auf meinem Arbeitscomputer jedoch nicht. Ich denke, Sie haben in Bezug auf die installierte Version möglicherweise den Nagel auf den Kopf getroffen. Meine Arbeitsmaschine sagt, dass leider keine Updates verfügbar sind. Meine Frage an Sie lautet also: Wie bestimme ich die genaue Version / Build von .net 4.6 auf meinem Computer? Die Dinge scheinen sich in dieser Hinsicht ein wenig geändert zu haben und ich kann nicht viele Anleitungen zu Build- / Versionsnummern finden.
Matt
Soweit ich weiß, verwende ich auf beiden Computern dieselbe Version von .net und vs 2015 RC. Der einzige Unterschied, den ich mir vorstellen kann, ist, dass auf dem Computer, der wie erwartet funktioniert (SP3), die neueste Insider-Vorschau von Windows 10 ausgeführt wird. Ich glaube, dass das .net-Framework damit ausgestattet ist. Vielleicht habe ich dort irgendwie eine neuere Version. Ich weiß nur nicht, wie ich das genau überprüfen soll.
Matt
UPDATE im Ordner c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 in den Eigenschaftsdetails für clr.dll kann ich einen Unterschied feststellen. Die Version auf meiner Oberfläche ist 4.6.79.0 und die Version auf meiner Arbeitsmaschine ist 4.6.57.0. Meine Frage ist nun, wie kann ich ein Upgrade von 4.6.57.0 auf 4.6.79.0 durchführen? (Warum ist das sooo schwer !;)
Matt
@Matt Ich glaube nicht, dass es das ist - ich habe auch 4.6.57.0 und es funktioniert gut. Ist es möglich, dass Sie eine Visual Studio-Erweiterung installiert haben, die die Dinge durcheinander bringt?
Luaan
Wenn Sie einen Unterschied im Verhalten feststellen, obwohl keine Updates angezeigt werden, sollten Sie möglicherweise die Verwendung des NuGet-Pakets "Microsoft.Net.Compilers" in Projekten in Betracht ziehen, die die neuesten C # -Funktionen verwenden. Dies kann die beobachteten Verhaltensunterschiede beheben. Das hat es in unseren Projekten getan.
Manfred
3

Hallo, die Regel für das Escape des Schrägstrichs in interpolierter Zeichenfolge lautet: Duplizieren Sie den Schrägstrich:

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\\{userName}";

Konsolenausgabe

Wenn Sie die interpolierte Zeichenfolge jedoch auch als wörtliche Zeichenfolge verwenden, müssen Sie dem Schrägstrich nicht entkommen:

var domain = "mydomain";
var userName = "myUserName";
var combo = $@"{domain}\{userName}";

und du bekommst das gleiche:

Konsolenausgabe

Ein Tutorial zur interpolierten Zeichenfolge finden Sie unter Video-interpolierte Zeichenfolge

freedeveloper
quelle
0

Wenn ich nicht missverstanden hätte. Die Lösung ist ganz einfach

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{{{domain}}}\\{{{userName}}}";
Console.WriteLine(combo);

Ich teile die Antwort der Vogelhändler sowie die dort zur Verfügung gestellte gute Referenz. Hoffe es ist hilfreich für dich. Meine 5 Cent

Eduardo
quelle
1
Du hast es falsch verstanden. Das OP versucht nicht, geschweiften Klammern zu entkommen. Sie geben eindeutig an, dass sie versuchen, einem Backslash selbst zu entkommen, und das normale `\\` funktioniert nicht in einer interpolierten Zeichenfolge
ProfK
-1

Sie können dies verwenden -

'First, declare the curley braces as chars
        Dim LeftBrace As Char = "{"
        Dim RightBrace As Char = "}"

        'Then in your string, use like this-
        Dim myStr As String = $"This is a {LeftBrace}String{RightBrace}"

        'Now, the output will be
        ' This is a {string}code here
Vinod KC
quelle
Dies ist kein C #? (aber VB.NET?)
Julian
Nun, das ist das gleiche Gefühl, wenn ein vb .net-Programmierer eine Antwort auf seine Frage erhält.
Vinod KC