Como usar caracteres de escape com interpolação de string em C # 6?

86

Tenho usado interpolação de strings e adoro isso, mas tenho um problema em que estou tentando incluir uma barra invertida na saída, mas não consigo fazer com que funcione.

O que eu quero é algo assim ..

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

Quero que a saída do combo seja

myDomain\myUserName

O que estou recebendo é um erro de sintaxe sobre o \ ser um caractere de escape. Se eu inserir \\, o erro snytax desaparece, mas a saída é myDomain \\ myUsername

Como posso incluir caracteres de escape em uma string interpolada?

Matt
fonte
Obrigado. Mas então eu não posso usar interpolação de string? Não quero fugir de tudo. Eu só quero usar uma barra invertida dentro de uma string interpolada.
Matt
Não, você não pode. Sua resposta está errada.
greenhoorn
3
parece um bug para mim;) \\ deve funcionar
Matt
Obtive a saída correta para $ {domain} \\ {userName} .. É um aplicativo da web?
greenhoorn
2
A resposta de Nhan parece funcionar perfeitamente. $@"{domain}\{userName}". Acho que você deveria tentar e aceitar. Eu tive exatamente o mesmo problema, também por ser domínio e nome de usuário, e seu método funciona bem.
ProfK

Respostas:

104

Escapar com uma barra invertida ( \) funciona para todos os caracteres, exceto uma chave.

Se estiver tentando escapar de uma chave ( {ou }), você deve usar {{ou de }}acordo com https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Todas as ocorrências de chaves duplas (“{{“ e “}}”) são convertidas em uma única chave.

birdamongmen
fonte
Não funciona para uma barra invertida em si, como o OP explica claramente.
ProfK
79

Você pode fazer isso usando tanto $ @. A ordem é importante.

var combo = $@"{domain}\{userName}";
Nhan
fonte
4
A melhor e simples resposta. Não entendo por que as pessoas escolhem respostas mais complicadas. Link do MSDN para strings interpoladas textuais docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758
2
"A partir do C # 8.0, você pode usar os tokens $ e @ em qualquer ordem" (do link de Alex no comentário acima).
Casey Plummer
8

Eduardo está correto. Você escapa das chaves dobrando-se. Portanto, se você quiser gerar a variável de domínio como {mydomain}, você precisa fazer:

$"{{{domain}}}";

Além disso, supondo que a data atual seja 1º de setembro de 2016, faça o seguinte:

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

geraria algo como "A data é 2016/09/01 3:04:48 PM" dependendo da sua localização. Você também pode formatar a data fazendo:

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

que geraria "A data é 1º de setembro de 2016". Strings interpoladas são muito mais legíveis. Boa resposta Eduardo.

Dirk Strauss
fonte
1
O OP não está tentando escapar das chaves. Eles afirmam claramente que estão tentando escapar de uma barra invertida, e o `\\` normal não funciona em uma string interpolada.
ProfK
3
Eu não me importo com o que OP estava perguntando. Eu queria escapar das chaves e a primeira entrada do Google foi esta. Portanto, o título do OP engana o Google e essa é uma resposta válida e merece votação positiva
AndrewBenjamin
4
$"{domain}\\{user}"

Funciona bem - o escape funciona normalmente (exceto ao escapar {). Pelo menos no .NET 4.6 e VS 14.0.22823 D14REL.

Se não funcionar por algum motivo (talvez você esteja usando uma versão mais antiga do compilador?), Você também pode tentar ser mais explícito:

$"{domain}{@"\"}{user}"
Luaan
fonte
Foi o que pensei também. interessante, na minha superfície pro 3, o código funciona bem com o \\ normal ou com o @ "\" explícito, mas na minha máquina de trabalho não funciona. então eu acho que você deve ter acertado em cheio no que diz respeito à versão instalada. Minha máquina de trabalho está dizendo que nenhuma atualização está disponível, infelizmente. Então, minha pergunta para você é como posso determinar a versão / compilação exata do .net 4.6 na minha máquina? as coisas parecem ter mudado um pouco a esse respeito e não consigo encontrar muita orientação sobre os números de compilação / versão.
Matt
Pelo que posso dizer, estou executando a mesma versão do .net e vs 2015 RC em ambas as máquinas. a única diferença que consigo pensar é que a máquina que está funcionando conforme o esperado (SP3) está executando a visualização interna mais recente do Windows 10. Eu acredito que o framework .net vem com isso, então talvez eu tenha uma versão mais recente lá de alguma forma. Só não sei como verificar especificamente.
Matt
ATUALIZAÇÃO procurando na pasta c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 nos detalhes da propriedade para clr.dll, posso ver a diferença. a versão na minha superfície é 4.6.79.0 e a versão na minha máquina de trabalho é 4.6.57.0. Minha pergunta agora é: como faço para atualizar de 4.6.57.0 para 4.6.79.0? (por que isso é tão difícil!;)
Matt
@Matt Não acho que seja isso - eu também tenho 4.6.57.0 e funciona bem. É possível que você tenha alguma extensão do Visual Studio instalada que bagunce as coisas?
Luaan
Caso você observe uma diferença de comportamento, apesar de não ver nenhuma atualização, talvez considere o uso do pacote NuGet "Microsoft.Net.Compilers" nos projetos que usam os recursos C # mais recentes. Isso pode resolver as diferenças observadas no comportamento. Isso aconteceu em nossos projetos.
Manfred
3

Olá, a regra para escapar da barra invertida na string interpolada é duplicar a barra invertida:

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

saída do console

mas se você também usar a string interpolada como string literal, não será necessário escapar da barra invertida:

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

e você recebe o mesmo:

saída do console

Para um tutorial sobre string interpolada: veja string interpolada de vídeo

freeeveloper
fonte
0

Se eu não entendesse mal. A solução é muito simples

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

Eu compartilho a resposta do birdamongmen e também uma boa referência fornecida lá. Espero que seja útil para você. Meus 5 centavos

Eduardo
fonte
1
Você entendeu mal. O OP não está tentando escapar das chaves. Eles afirmam claramente que estão tentando escapar da própria barra invertida, e o `\\` normal não funciona em uma string interpolada
ProfK
-1

Você pode usar isso -

'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
fonte
Este não é um C #? (mas VB.NET?)
Julian
Bem, este é o mesmo sentimento quando um programador vb .net obtém uma resposta c # para sua pergunta.
Vinod KC