Jak używać znaków ucieczki z interpolacją ciągów w C # 6?

86

Używam interpolacji ciągów i uwielbiam to, jednak mam problem polegający na tym, że próbuję dołączyć ukośnik odwrotny do moich danych wyjściowych, ale nie mogę go uruchomić.

To, czego chcę, to coś takiego ...

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

Chcę, aby wynik combo był

myDomain\myUserName

Otrzymuję błąd składni dotyczący znaku \ będącego znakiem zmiany znaczenia. Jeśli wstawię \\, błąd snytax zniknął, ale wyjście to mojaDomena \\ nazwa_użytkownika

Jak mogę dołączyć znaki ucieczki w ciągu interpolowanym?

Matt
źródło
Dzięki. Ale potem nie mogę użyć interpolacji ciągów? Nie chcę uciec od wszystkiego. Chcę tylko użyć ukośnika odwrotnego wewnątrz interpolowanego ciągu.
Matt
Nie, nie możesz. Jego odpowiedź jest błędna.
greenhoorn
3
czuję się jak błąd;) \\ powinno działać
Matt
Otrzymuję poprawne dane wyjściowe dla $ {domain} \\ {userName} .. Czy to jest aplikacja internetowa?
greenhoorn
2
Odpowiedź Nhan wydaje się działać doskonale. $@"{domain}\{userName}". Myślę, że powinieneś spróbować i zaakceptować to. Miałem dokładnie ten sam problem, sprowadzając się do domeny i nazwy użytkownika, a jego metoda działa dobrze.
ProfK,

Odpowiedzi:

104

Zmiana ucieczki z ukośnikiem odwrotnym ( \) działa dla wszystkich znaków oprócz nawiasu klamrowego.

Jeśli próbujesz uciec przed nawiasem klamrowym ( {lub }), musisz użyć {{lub }}na https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Wszystkie wystąpienia podwójnych nawiasów klamrowych („{{” i „}}”) są konwertowane na pojedynczy nawias klamrowy.

ptaków wśród ludzi
źródło
To nie działa dla samego odwrotnego ukośnika, jak jasno wyjaśnia OP.
ProfK,
79

Możesz to zrobić, używając zarówno $ @. Kolejność jest ważna.

var combo = $@"{domain}\{userName}";
Nhan
źródło
4
Najlepsza i prosta odpowiedź. Nie rozumiem, dlaczego ludzie wybierają bardziej skomplikowane odpowiedzi. Łącze MSDN do interpolowanych ciągów znaków verbatim docs.microsoft.com/en-us/dotnet/csharp/tutorials/ ...
Alex34758
2
„Począwszy od C # 8.0, możesz używać tokenów $ i @ w dowolnej kolejności” (z linku Alexa w powyższym komentarzu).
Casey Plummer
8

Eduardo ma rację. Unikasz kręconych szelek, podwajając się. Dlatego jeśli chcesz wyprowadzić zmienną domeny jako {moja_domena}, musisz zrobić:

$"{{{domain}}}";

Ponadto, zakładając, że aktualna data to 1 września 2016 r., Wykonaj następujące czynności:

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

wyświetli coś w rodzaju „Data to 2016/09/01 3:04:48 PM” w zależności od lokalizacji. Możesz też sformatować datę, wykonując:

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

co spowoduje wyświetlenie tekstu „Data to 1 września 2016 r.”. Ciągi interpolowane są znacznie bardziej czytelne. Dobra odpowiedź, Eduardo.

Dirk Strauss
źródło
1
OP nie próbuje uciec przed nawiasami klamrowymi. Wyraźnie stwierdzają, że próbują uniknąć samego ukośnika odwrotnego, a normalny `\\` nie działa w interpolowanym ciągu.
ProfK
3
Nie obchodzi mnie, o co pyta OP. Chciałem uciec przed nawiasami klamrowymi, a pierwszy wpis w Google był taki. Tak więc nagłówek OP wprowadza Google w błąd i dlatego jest to poprawna odpowiedź i zasługuje na poparcie.
AndrewBenjamin
4
$"{domain}\\{user}"

Działa dobrze - ucieczka działa jak zwykle (z wyjątkiem ucieczki {). Przynajmniej na .NET 4.6 i VS 14.0.22823 D14REL.

Jeśli z jakiegoś powodu to nie zadziała (może używasz starszej wersji kompilatora?), Możesz również spróbować wyrazić się bardziej szczegółowo:

$"{domain}{@"\"}{user}"
Luaan
źródło
Ja też tak myślałem. co ciekawe, na moim Surface Pro 3 kod działa dobrze zarówno z normalnym \\, jak i jawnym @ "\", jednak na moim komputerze roboczym tak nie jest. więc myślę, że mogłeś trafić w sedno w odniesieniu do zainstalowanej wersji. Mój komputer roboczy informuje, że niestety nie są dostępne żadne aktualizacje. Moje pytanie brzmi więc, jak określić dokładną wersję / kompilację .net 4.6 na moim komputerze? wydaje się, że w tym względzie trochę się zmieniło i nie jestem w stanie znaleźć zbyt wielu wskazówek dotyczących numerów kompilacji / wersji.
Matt
z tego, co wiem, używam tej samej wersji .net i 2015 RC na obu komputerach. jedyną różnicą, jaką przychodzi mi do głowy, jest to, że komputer, który działa zgodnie z oczekiwaniami (SP3), ma najnowszą wersję podglądu systemu Windows 10. Wierzę, że platforma .net jest w tym wyposażona, więc może mam tam jakoś nowszą wersję. Po prostu nie wiem, jak konkretnie to sprawdzić.
Matt
UPDATE patrząc w folderze c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 w szczegółach właściwości dla clr.dll Widzę różnicę. wersja na mojej powierzchni to 4.6.79.0, a wersja na moim komputerze roboczym to 4.6.57.0. Więc moje pytanie brzmi teraz, jak zaktualizować z 4.6.57.0 do 4.6.79.0? (dlaczego to takie trudne!;)
Matt
@Matt Nie sądzę, żeby to było to - mam też 4.6.57.0 i działa dobrze. Czy to możliwe, że masz zainstalowane jakieś rozszerzenie Visual Studio, które psuje?
Luaan,
Jeśli zauważysz różnicę w zachowaniu, mimo że nie widzisz żadnych aktualizacji, możesz rozważyć użycie pakietu NuGet „Microsoft.Net.Compilers” w projektach korzystających z najnowszych funkcji C #. Może to rozwiązać zaobserwowane różnice w zachowaniu. Tak było w naszych projektach.
Manfred
3

Cześć, reguła ucieczki ukośnika w interpolowanym ciągu jest duplikatem ukośnika:

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

wyjście konsoli

ale jeśli używasz również interpolowanego ciągu jako ciągu dosłownego, nie musisz uciekać przed ukośnikiem:

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

i otrzymujesz to samo:

wyjście konsoli

Aby zapoznać się z samouczkiem dotyczącym interpolowanego ciągu znaków: zobacz wideo interpolowany ciąg

freedeveloper
źródło
0

Gdybym nie przegapił zrozumienia. Rozwiązanie jest naprawdę proste

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

Dzielę się odpowiedzią ptaków wśród ludzi, a także dobrą referencją. Mam nadzieję, że to ci pomoże. Moje 5 centów

Eduardo
źródło
1
Źle zrozumiałeś. OP nie próbuje uciec przed szelkami. Wyraźnie stwierdzają, że próbują uniknąć samego odwrotnego ukośnika, a normalny `\\` nie działa w interpolowanym ciągu
ProfK,
-2

Możesz tego użyć -

'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
źródło
1
To nie jest C #? (ale VB.NET?)
Julian
Cóż, to jest to samo uczucie, gdy programista vb .net otrzymuje odpowiedź ac # na swoje pytanie.
Vinod KC