Comment utiliser des caractères d'échappement avec une interpolation de chaîne en C # 6?

86

J'utilise l'interpolation de chaînes et j'adore ça, mais j'ai un problème où j'essaie d'inclure une barre oblique inverse dans ma sortie, mais je ne parviens pas à le faire fonctionner.

Ce que je veux, c'est quelque chose comme ça.

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

Je veux que la sortie du combo soit

myDomain\myUserName

Ce que j'obtiens, c'est une erreur de syntaxe concernant le \ étant un caractère d'échappement. Si je mets \\ alors l'erreur snytax a disparu, mais la sortie est myDomain \\ myUsername

Comment puis-je inclure des caractères échappés dans une chaîne interpolée?

Mat
la source
Merci. Mais alors je ne peux pas utiliser l'interpolation de chaîne? Je ne veux pas tout échapper. Je veux juste utiliser une barre oblique inverse à l'intérieur d'une chaîne interpolée.
Matt
Non, tu ne peux pas. Sa réponse est fausse.
greenhoorn
3
me sens comme un bug;) \\ devrait fonctionner
Matt
J'obtiens la sortie correcte pour $ {domain} \\ {userName} .. S'agit-il d'une application Web?
greenhoorn
2
La réponse de Nhan semble fonctionner parfaitement. $@"{domain}\{userName}". Je pense que vous devriez l'essayer et l'accepter. J'ai eu exactement le même problème, car il s'agit également du domaine et du nom d'utilisateur, et sa méthode fonctionne bien.
ProfK

Réponses:

104

L'échappement avec une barre oblique inverse ( \) fonctionne pour tous les caractères à l'exception d'une accolade.

Si vous essayez d'échapper à une accolade ( {ou }), vous devez utiliser {{ou }}par https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Toutes les occurrences d'accolades doubles ("{{" et "}}") sont converties en accolades simples.

oiseau parmi les hommes
la source
Cela ne fonctionne pas pour une barre oblique inverse elle-même, comme l'explique clairement l'OP.
ProfK
79

Vous pouvez le faire, en utilisant à la fois $ @. L'ordre est important.

var combo = $@"{domain}\{userName}";
Nhan
la source
4
La réponse la meilleure et la plus simple. Je ne comprends pas pourquoi les gens choisissent des réponses plus compliquées. Lien MSDN pour les chaînes interpolées verbatim docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758
2
"A partir de C # 8.0, vous pouvez utiliser les jetons $ et @ dans n'importe quel ordre" (Du lien d'Alex dans le commentaire ci-dessus).
Casey Plummer
8

Eduardo a raison. Vous échappez aux accolades en doublant. Par conséquent, si vous souhaitez afficher la variable de domaine sous la forme {mydomain}, vous devez faire:

$"{{{domain}}}";

En outre, en supposant que la date actuelle est le 1er septembre 2016, procédez comme suit:

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

affichera quelque chose comme "La date est le 01/09/2016 3:04:48 PM" en fonction de votre localisation. Vous pouvez également formater la date en faisant:

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

qui produirait "La date est le 1er septembre 2016". Les chaînes interpolées sont beaucoup plus lisibles. Bonne réponse Eduardo.

Dirk Strauss
la source
1
L'OP n'essaie pas d'échapper aux accolades. Ils déclarent clairement qu'ils essaient d'échapper à une barre oblique inverse elle-même, et le \\ `normal ne fonctionne pas dans une chaîne interpolée.
ProfK
3
Je me fiche de ce que OP demandait, je voulais échapper aux accolades et la première entrée Google était celle-ci. Donc, OP rubrique induit google en erreur et c'est donc une réponse valable et mérite un vote favorable.
AndrewBenjamin
4
$"{domain}\\{user}"

Fonctionne bien - l'échappement fonctionne comme d'habitude (sauf lors de l'échappement {). Au moins sur .NET 4.6 et VS 14.0.22823 D14REL.

Si cela ne fonctionne pas pour une raison quelconque (peut-être que vous utilisez une ancienne version du compilateur?), Vous pouvez également essayer d'être plus explicite:

$"{domain}{@"\"}{user}"
Luaan
la source
C'est ce que je pensais aussi. intéressant, sur ma surface pro 3, le code fonctionne bien avec le \\ normal ou explicite @ "\", mais sur ma machine de travail, il ne fonctionne pas. donc je pense que vous avez peut-être frappé dans le mille en ce qui concerne la version installée. Ma machine de travail dit qu'aucune mise à jour n'est disponible, malheureusement. Donc, ma question est de savoir comment déterminer la version / build exacte de .net 4.6 sur ma machine? les choses semblent avoir changé un peu à cet égard et je ne suis pas en mesure de trouver beaucoup de conseils sur les numéros de build / version.
Matt
d'après ce que je peux dire, j'utilise la même version de .net et vs 2015 RC sur les deux machines. la seule différence à laquelle je peux penser est que la machine qui fonctionne comme prévu (SP3) exécute le dernier aperçu d'initié de Windows 10. Je crois que le framework .net est livré avec cela, alors peut-être que j'ai une version plus récente là-bas. Je ne sais tout simplement pas comment vérifier spécifiquement.
Matt
MISE À JOUR en regardant dans le dossier c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 aux détails de la propriété pour clr.dll je peux voir une différence. la version sur ma surface est 4.6.79.0 et la version sur ma machine de travail est 4.6.57.0. Donc ma question est maintenant, comment puis-je passer de 4.6.57.0 à 4.6.79.0? (pourquoi est-ce si difficile!;)
Matt
@Matt Je ne pense pas que ce soit ça - j'ai aussi 4.6.57.0 et ça marche bien. Est-il possible que vous ayez installé une extension Visual Studio qui gâche les choses?
Luaan
Si vous observez une différence de comportement malgré l'absence de mises à jour, envisagez peut-être l'utilisation du package NuGet «Microsoft.Net.Compilers» dans les projets qui utilisent les dernières fonctionnalités C #. Cela peut résoudre les différences de comportement observées. Cela s'est produit dans nos projets.
Manfred
3

Salut la règle pour échapper la barre oblique inverse dans la chaîne interpolée est de dupliquer la barre oblique inverse:

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

sortie de la console

mais si vous utilisez également la chaîne interpolée comme chaîne textuelle, vous n'avez pas besoin d'échapper à la barre oblique inverse:

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

et vous obtenez la même chose:

sortie de la console

Pour un didacticiel sur la chaîne interpolée: voir la chaîne interpolée vidéo

développeur libre
la source
0

Si je n'ai pas mal compris. La solution est vraiment simple

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

Je partage la réponse birdamongmen ainsi que la bonne référence fournie ici. J'espère que cela vous sera utile. Mes 5 cents

Eduardo
la source
1
Vous avez mal compris. L'OP n'essaie pas d'échapper aux accolades. Ils déclarent clairement qu'ils essaient d'échapper à une contre-oblique elle-même, et le `\\` normal ne fonctionne pas dans une chaîne interpolée
ProfK
-1

Vous pouvez utiliser ceci -

'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
la source
Ce n'est pas C #? (mais VB.NET?)
Julian
Eh bien, c'est le même sentiment quand un programmeur vb .net obtient une réponse ac # à sa question.
Vinod KC