Come utilizzare i caratteri di escape con l'interpolazione di stringhe in C # 6?


88

Ho usato l'interpolazione di stringhe e l'ho amata, tuttavia ho un problema in cui cerco di includere una barra rovesciata nel mio output, ma non riesco a farlo funzionare.

Quello che voglio è qualcosa del genere ..

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

Voglio che l'output di combo sia

myDomain\myUserName

Quello che ottengo è un errore di sintassi relativo al fatto che \ è un carattere di escape. Se inserisco \\, l'errore snytax è sparito, ma l'output è myDomain \\ myUsername

Come posso includere caratteri di escape in una stringa interpolata?


Grazie. Ma allora non posso usare l'interpolazione di stringhe? Non voglio scappare da tutto. Voglio solo usare una barra rovesciata all'interno di una stringa interpolata.
Matt

No non puoi. La sua risposta è sbagliata.
Greenhoorn

3
mi sembra un bug;) \\ dovrebbe funzionare
Matt

Ottengo l'output corretto per $ {domain} \\ {userName} .. È un'applicazione web?
Greenhoorn

2
La risposta di Nhan sembra funzionare perfettamente. $@"{domain}\{userName}". Penso che dovresti provarlo e accettarlo. Ho avuto esattamente lo stesso problema, essendo anche dominio e nome utente, e il suo metodo funziona bene.
ProfK

Risposte:


107

L'escape con una barra rovesciata ( \) funziona per tutti i caratteri tranne una parentesi graffa.

Se stai cercando di evitare una parentesi graffa ( {o }), devi usare {{o }}per https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Tutte le occorrenze di doppie parentesi graffe ("{{" e "}}") vengono convertite in una singola parentesi graffa.


Non funziona per un backslash stesso, come spiega chiaramente l'OP.
ProfK

80

Puoi farlo, usando sia $ @. L'ordine è importante.

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

4
La risposta migliore e semplice. Non capisco perché le persone scelgono risposte più complicate. Collegamento MSDN per stringhe interpolate verbatim docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758

3
"A partire da C # 8.0, puoi usare i token $ e @ in qualsiasi ordine" (Dal link di Alex nel commento sopra).
Casey Plummer

9

Eduardo ha ragione. Scappi dalle parentesi graffe raddoppiando. Pertanto, se si desidera visualizzare la variabile di dominio come {miodominio}, è necessario:

$"{{{domain}}}";

Inoltre, supponendo che la data corrente sia il 1 ° settembre 2016, in questo modo:

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

produrrebbe qualcosa come "La data è 2016/09/01 3:04:48 PM" a seconda della tua localizzazione. Puoi anche formattare la data facendo:

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

che produrrebbe "La data è il 1 settembre 2016". Le stringhe interpolate sono molto più leggibili. Buona risposta Eduardo.


1
L'OP non sta cercando di sfuggire alle parentesi graffe. Dichiarano chiaramente che stanno cercando di sfuggire a una barra rovesciata stessa e il normale "\\" non funziona in una stringa interpolata.
ProfK

3
Non mi interessa cosa chiedesse OP, volevo sfuggire alle parentesi graffe e la prima voce di Google era questa. Quindi l'intestazione OP fuorviare Google e questa è quindi una risposta valida e merita un voto positivo.
AndrewBenjamin

4
$"{domain}\\{user}"

Funziona bene - l'escape funziona come al solito (tranne quando l'escape {). Almeno su .NET 4.6 e VS 14.0.22823 D14REL.

Se per qualche motivo non funziona (forse stai usando una versione precedente del compilatore?), Potresti anche provare a essere più esplicito:

$"{domain}{@"\"}{user}"

È quello che ho pensato anch'io. interessante, sulla mia superficie pro 3, il codice funziona bene sia con il normale \\ o esplicito @ "\", ma sulla mia macchina da lavoro non lo fa. quindi penso che potresti aver centrato il bersaglio per quanto riguarda la versione installata. Sfortunatamente, la mia macchina da lavoro dice che non sono disponibili aggiornamenti. Quindi, la mia domanda è come determinare la versione / build esatta di .net 4.6 sulla mia macchina? le cose sembrano essere leggermente cambiate in questo senso e non sono in grado di trovare molte indicazioni sui numeri di build / versione.
Matt

da quello che posso dire sto eseguendo la stessa versione di .net e vs 2015 RC su entrambe le macchine. l'unica differenza a cui riesco a pensare è che la macchina che funziona come previsto (SP3) esegue l'ultima anteprima interna di Windows 10. Credo che .net framework venga fornito con questo, quindi forse ho una versione più recente lì in qualche modo. Tuttavia, non so come controllare in modo specifico.
Matt

AGGIORNAMENTO guardando nella cartella c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 i dettagli della proprietà per clr.dll posso vedere una differenza. la versione sulla mia superficie è 4.6.79.0 e la versione sulla mia macchina da lavoro è 4.6.57.0. Quindi la mia domanda è ora, come faccio a eseguire l'aggiornamento da 4.6.57.0 a 4.6.79.0? (perché è così difficile!;)
Matt

@ Matt Non credo sia tutto - ho anche 4.6.57.0 e funziona bene. È possibile che tu abbia installato qualche estensione di Visual Studio che rovina le cose?
Luaan

Nel caso in cui si osservi una differenza di comportamento nonostante non si vedano aggiornamenti, forse si consideri l'uso del pacchetto NuGet "Microsoft.Net.Compilers" nei progetti che utilizzano le ultime funzionalità C #. Ciò può risolvere le differenze osservate nel comportamento. Lo ha fatto nei nostri progetti.
Manfred

3

Ciao, la regola per sfuggire alla barra rovesciata nella stringa interpolata è duplicare la barra rovesciata:

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

output della console

ma se usi anche la stringa interpolata come stringa letterale, non è necessario sfuggire alla barra rovesciata:

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

e ottieni lo stesso:

output della console

Per un tutorial sulla stringa interpolata: vedere la stringa interpolata video


0

Se non avessi capito male. La soluzione è davvero semplice

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

Condivido la risposta di birdamongmen e un buon riferimento fornito lì. Spero che ti sia utile. I miei 5 centesimi


1
Hai frainteso. L'OP non sta cercando di sfuggire alle parentesi graffe. Dichiarano chiaramente che stanno cercando di sfuggire a un backslash stesso e il normale "\\" non funziona in una stringa interpolata
ProfK

-2

Puoi usare questo -

'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

1
Questo non è C #? (ma VB.NET?)
Julian

Ebbene, questa è la stessa sensazione quando un programmatore vb .net ottiene una risposta ac # per la sua domanda.
Vinod KC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.