¿Cómo usar caracteres de escape con interpolación de cadenas en C # 6?

86

He estado usando la interpolación de cadenas y me encanta, sin embargo, tengo un problema en el que trato de incluir una barra invertida en mi salida, pero no puedo hacer que funcione.

Lo que quiero es algo como esto ...

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

Quiero que la salida del combo sea

myDomain\myUserName

Lo que obtengo es un error de sintaxis acerca de que \ es un carácter de escape. Si pongo \\, el error snytax desaparece, pero la salida es myDomain \\ myUsername

¿Cómo puedo incluir caracteres de escape en una cadena interpolada?

Mate
fuente
Gracias. ¿Pero entonces no puedo usar la interpolación de cadenas? No quiero escapar de todo. Solo quiero usar una barra invertida dentro de una cadena interpolada.
Matt
No, no puedes. Su respuesta es incorrecta.
greenhoorn
3
me parece un error;) \\ debería funcionar
Matt
Obtengo la salida correcta para $ {domain} \\ {userName} .. ¿Es una aplicación web?
greenhoorn
2
La respuesta de Nhan parece funcionar perfectamente. $@"{domain}\{userName}". Creo que deberías probarlo y aceptarlo. Tuve exactamente el mismo problema, ya que también es el dominio y el nombre de usuario, y su método funciona bien.
ProfK

Respuestas:

104

Escapar con una barra invertida ( \) funciona para todos los caracteres excepto para las llaves.

Si está intentando escapar de una llave ( {o }), debe usar {{o }}según https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Todas las apariciones de llaves dobles (“{{“ y “}}”) se convierten en una sola llave.

Birdamongmen
fuente
No funciona para una barra invertida en sí, como lo explica claramente el OP.
ProfK
79

Puede hacer esto, usando tanto $ @. El orden es importante.

var combo = $@"{domain}\{userName}";
Nhan
fuente
4
La mejor y más sencilla respuesta. No entiendo por qué la gente elige respuestas más complicadas. Enlace de MSDN para cadenas interpoladas textualmente docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758
2
"A partir de C # 8.0, puede usar los tokens $ y @ en cualquier orden" (del enlace de Alex en el comentario anterior).
Casey Plummer
8

Eduardo tiene razón. Escapas de los tirantes rizados doblando. Por lo tanto, si desea generar la variable de dominio como {midominio}, deberá hacer lo siguiente:

$"{{{domain}}}";

Además, suponiendo que la fecha actual sea el 1 de septiembre de 2016, hacer esto:

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

generaría algo como "La fecha es 2016/09/01 3:04:48 PM" dependiendo de su localización. También puede formatear la fecha haciendo:

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

que daría como resultado "La fecha es el 1 de septiembre de 2016". Las cadenas interpoladas son mucho más legibles. Buena respuesta Eduardo.

Dirk Strauss
fuente
1
El OP no está tratando de escapar de las llaves. Indican claramente que están tratando de escapar de una barra invertida en sí, y que el `\\` normal no funciona en una cadena interpolada.
ProfK
3
No me importa lo que OP estuviera preguntando, quería escapar de las llaves y la primera entrada de Google fue esta. Entonces, el encabezado OP engañó a Google y, por lo tanto, esta es una respuesta válida y merece una votación a favor.
AndrewBenjamin
4
$"{domain}\\{user}"

Funciona bien: el escape funciona como de costumbre (excepto al escapar {). Al menos en .NET 4.6 y VS 14.0.22823 D14REL.

Si no funciona por alguna razón (¿tal vez esté usando una versión anterior del compilador?), También podría intentar ser más explícito:

$"{domain}{@"\"}{user}"
Luaan
fuente
Eso es lo que pensé yo también. interesante, en mi Surface Pro 3, el código funciona bien con el \\ normal o explícito @ "\", sin embargo, en mi máquina de trabajo no es así. así que creo que puede haber dado en el clavo con respecto a la versión instalada. Mi máquina de trabajo dice que no hay actualizaciones disponibles, desafortunadamente. Entonces, mi pregunta es cómo puedo determinar la versión / compilación exacta de .net 4.6 en mi máquina. las cosas parecen haber cambiado un poco a este respecto y no puedo encontrar mucha orientación sobre los números de versión / compilación.
Matt
por lo que puedo decir, estoy ejecutando la misma versión de .net y vs 2015 RC en ambas máquinas. la única diferencia en la que puedo pensar es que la máquina que está funcionando como se esperaba (SP3) está ejecutando la última vista previa interna de Windows 10. Creo que .net framework viene con esto, así que tal vez tenga una versión más nueva allí de alguna manera. Aunque no sé cómo comprobarlo específicamente.
Matt
ACTUALIZAR mirando en la carpeta c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 en los detalles de la propiedad para clr.dll puedo ver una diferencia. la versión en mi superficie es 4.6.79.0 y la versión en mi máquina de trabajo es 4.6.57.0. Entonces mi pregunta es ahora, ¿cómo actualizo de 4.6.57.0 a 4.6.79.0? (¿Por qué es esto tan difícil?)
Matt
@ Matt No creo que sea eso, también tengo 4.6.57.0 y funciona bien. ¿Es posible que tenga instalada alguna extensión de Visual Studio que estropee las cosas?
Luaan
En caso de que observe una diferencia en el comportamiento a pesar de no ver ninguna actualización, quizás considere el uso del paquete NuGet "Microsoft.Net.Compilers" en los proyectos que usan las últimas funciones de C #. Esto puede resolver las diferencias de comportamiento observadas. Lo hizo en nuestros proyectos.
Manfred
3

Hola, la regla para escapar de la barra invertida en una cadena interpolada es duplicar la barra invertida:

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

salida de consola

pero si también usa la cadena interpolada como cadena literal, entonces no necesita escapar de la barra invertida:

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

y obtienes lo mismo:

salida de consola

Para ver un tutorial sobre la cadena interpolada: vea el video cadena interpolada

freedesveloper
fuente
0

Si no lo entendí mal. La solución es realmente simple

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

Comparto la respuesta de birdamongmen y la buena referencia que se proporciona allí. Espero que te sea de ayuda. Mis 5 centavos

Eduardo
fuente
1
Lo entendiste mal. El OP no está tratando de escapar de las llaves. Indican claramente que están tratando de escapar de una barra invertida, y el `\\` normal no funciona en una cadena interpolada
ProfK
-1

Puedes usar esto -

'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
fuente
¿Esto no es C #? (¿pero VB.NET?)
Julián
Bueno, este es el mismo sentimiento cuando un programador de vb .net obtiene una respuesta # para su pregunta.
Vinod KC