Làm thế nào để sử dụng các ký tự thoát với nội suy chuỗi trong C # 6?


86

Tôi đã sử dụng nội suy chuỗi và yêu thích nó, tuy nhiên tôi gặp sự cố khi tôi đang cố đưa dấu gạch chéo ngược vào đầu ra của mình, nhưng không thể làm cho nó hoạt động.

Những gì tôi muốn là một cái gì đó như thế này ..

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

Tôi muốn đầu ra của combo là

myDomain\myUserName

Những gì tôi nhận được là một lỗi cú pháp về \ là một ký tự thoát. Nếu tôi đặt vào \\ thì lỗi snytax biến mất, nhưng đầu ra là myDomain \\ myUsername

Làm cách nào để đưa các ký tự thoát vào một chuỗi nội suy?


Cảm ơn. Nhưng sau đó tôi không thể sử dụng nội suy chuỗi? Tôi không muốn trốn tránh mọi thứ. Tôi chỉ muốn sử dụng dấu gạch chéo ngược bên trong chuỗi nội suy.
Matt,

Không, bạn không thể. Câu trả lời của anh ấy là sai.
greenhoorn

3
Tôi cảm thấy như một lỗi đối với tôi;) \\ sẽ hoạt động
Matt.

Tôi nhận được đầu ra chính xác cho $ {domain} \\ {userName} .. Nó có phải là một ứng dụng web không?
greenhoorn

2
Câu trả lời của Nhân dường như hoạt động hoàn hảo. $@"{domain}\{userName}". Tôi nghĩ bạn nên thử nó, và chấp nhận nó. Tôi gặp chính xác vấn đề tương tự, liên quan đến miền và tên người dùng, và phương pháp của anh ấy hoạt động tốt.
ProfK

Câu trả lời:


104

Thoát bằng dấu gạch chéo ngược ( \) hoạt động cho tất cả các ký tự ngoại trừ dấu ngoặc nhọn.

Nếu bạn đang cố gắng thoát một dấu ngoặc nhọn ( {hoặc }), bạn phải sử dụng {{hoặc }}mỗi https://msdn.microsoft.com/en-us/library/dn961160.aspx .

... Tất cả các lần xuất hiện của dấu ngoặc nhọn kép (“{{“ và “}}”) được chuyển thành một dấu ngoặc nhọn đơn.


Bản thân nó không hoạt động đối với dấu gạch chéo ngược, như OP đã giải thích rõ ràng.
ProfK

79

Bạn có thể làm điều này, sử dụng cả $ @. Thứ tự là quan trọng.

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

4
Câu trả lời đơn giản và tốt nhất. Không hiểu tại sao mọi người lại chọn những câu trả lời phức tạp hơn. Liên kết MSDN cho chuỗi nội suy nguyên văn docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758

2
"Bắt đầu với C # 8.0, bạn có thể sử dụng các mã thông báo $ và @ theo bất kỳ thứ tự nào" (Từ liên kết của Alex trong nhận xét ở trên).
Casey Plummer

8

Eduardo đúng. Bạn thoát khỏi dấu ngoặc nhọn bằng cách nhân đôi lên. Do đó, nếu bạn muốn xuất biến miền dưới dạng {mydomain}, bạn cần thực hiện:

$"{{{domain}}}";

Hơn nữa, giả sử rằng ngày hiện tại là ngày 1 tháng 9 năm 2016, hãy thực hiện điều này:

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

sẽ xuất ra một cái gì đó như "Ngày là 2016/09/01 3:04:48 CH" tùy thuộc vào bản địa hóa của bạn. Bạn cũng có thể định dạng ngày bằng cách:

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

sẽ xuất ra "Ngày là ngày 1 tháng 9 năm 2016". Các chuỗi nội suy dễ đọc hơn nhiều. Câu trả lời tốt, Eduardo.


1
OP không cố gắng thoát khỏi dấu ngoặc nhọn. Họ tuyên bố rõ ràng rằng họ đang cố gắng thoát khỏi dấu gạch chéo ngược và ký tự `\\ 'bình thường không hoạt động trong một chuỗi nội suy.
ProfK

3
Tôi không quan tâm OP đã hỏi gì, tôi muốn thoát khỏi dấu ngoặc nhọn và mục nhập google đầu tiên là cái này. Vì vậy, tiêu đề OP đánh lừa google và do đó đây là một câu trả lời hợp lệ và đáng được ủng hộ.
AndrewBenjamin

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

Hoạt động tốt - thoát hoạt động như bình thường (trừ khi thoát {). Ít nhất trên .NET 4.6 và VS 14.0.22823 D14REL.

Nếu nó không hoạt động vì một số lý do (có thể bạn đang sử dụng phiên bản cũ hơn của trình biên dịch?), Bạn cũng có thể thử trình bày rõ ràng hơn:

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

Đó là những gì tôi cũng nghĩ. thú vị, trên bề mặt pro 3 của tôi, mã hoạt động tốt với \\ bình thường hoặc @ "\" thông thường, tuy nhiên trên máy làm việc của tôi thì không. vì vậy tôi nghĩ rằng bạn có thể đã đánh vào đầu liên quan đến phiên bản được cài đặt. Máy làm việc của tôi nói rằng không có bản cập nhật nào, rất tiếc. Vì vậy, câu hỏi của tôi dành cho bạn là làm cách nào để xác định phiên bản / bản dựng chính xác của .net 4.6 trên máy tính của tôi? mọi thứ dường như đã thay đổi một chút về vấn đề này, tôi không thể tìm thấy nhiều hướng dẫn về số phiên bản / phiên bản.
Matt

từ những gì tôi có thể cho biết tôi đang chạy cùng một phiên bản .net và vs 2015 RC trên cả hai máy. sự khác biệt duy nhất tôi có thể nghĩ đến là máy đang hoạt động như mong đợi (SP3) đang chạy bản xem trước nội bộ mới nhất của windows 10. Tôi tin rằng .net framework đi kèm với điều này, vì vậy có thể tôi có một phiên bản mới hơn ở đó. Tôi chỉ không biết làm thế nào để kiểm tra cụ thể mặc dù.
Matt,

CẬP NHẬT khi tìm trong thư mục c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 tại chi tiết thuộc tính cho clr.dll, tôi có thể thấy sự khác biệt. phiên bản trên bề mặt của tôi là 4.6.79.0 và phiên bản trên máy công việc của tôi là 4.6.57.0. Vì vậy, câu hỏi của tôi bây giờ là, làm cách nào để nâng cấp từ 4.6.57.0 lên 4.6.79.0? (tại sao điều này quá khó!;)
Matt

@Matt Tôi không nghĩ đó là nó - tôi cũng có 4.6.57.0 và nó hoạt động tốt. Có thể bạn đã cài đặt một số tiện ích mở rộng Visual Studio làm mọi thứ rối tung lên không?
Luaan

Trong trường hợp bạn quan sát thấy sự khác biệt trong hành vi mặc dù không thấy bất kỳ bản cập nhật nào, có lẽ hãy xem xét việc sử dụng gói NuGet "Microsoft.Net.Compilers" trong các dự án sử dụng các tính năng C # mới nhất. Điều này có thể giải quyết những khác biệt quan sát được trong hành vi. Nó đã làm trong các dự án của chúng tôi.
Manfred

3

Xin chào quy tắc để thoát khỏi dấu gạch chéo ngược trong chuỗi nội suy là sao chép dấu gạch chéo sau:

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

đầu ra bảng điều khiển

nhưng nếu bạn cũng sử dụng chuỗi nội suy dưới dạng chuỗi nguyên văn thì bạn không cần phải thoát khỏi dấu gạch chéo ngược:

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

và bạn nhận được như nhau:

đầu ra bảng điều khiển

Để có hướng dẫn về chuỗi nội suy: xem video chuỗi nội suy


0

Nếu tôi không hiểu lầm. Giải pháp rất đơn giản

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

Tôi chia sẻ câu trả lời của birdamongmen cũng như tài liệu tham khảo tốt được cung cấp ở đó. Hy vọng nó hữu ích cho bạn. 5 xu của tôi


1
Bạn đã hiểu sai. OP không cố gắng thoát khỏi dấu ngoặc nhọn. Họ tuyên bố rõ ràng rằng họ đang cố gắng thoát khỏi dấu gạch chéo ngược và ký tự `\\ 'bình thường không hoạt động trong một chuỗi nội suy
ProfK

-1

Bạn có thể sử dụng cái nà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

Đây không phải là C #? (nhưng VB.NET?)
Julian

Chà, đây cũng là cảm giác khi một lập trình viên vb .net nhận được câu trả lời ac # cho câu hỏi của mình.
Vinod KC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.