Làm thế nào để bạn sử dụng chuỗi nguyên văn với nội suy?


133

Trong C # 6 có một tính năng mới: chuỗi nội suy.

Những thứ này cho phép bạn đặt các biểu thức trực tiếp vào mã, thay vì dựa vào các chỉ mục:

string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());

Trở thành:

string s = $"Adding \"{x}\" and {this.Y()} to foobar.";

Tuy nhiên, chúng tôi có rất nhiều chuỗi trên nhiều dòng bằng cách sử dụng các chuỗi nguyên văn (chủ yếu là các câu lệnh SQL) như thế này:

string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());

Hoàn nguyên những thứ này thành các chuỗi thông thường có vẻ lộn xộn:

string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();

Làm cách nào để sử dụng cả nguyên văn và chuỗi nội suy với nhau?


3
Nếu đó thực sự là về các chuỗi SQL, có lý do nào khiến bạn không sử dụng các truy vấn được tham số hóa không?
svick

1
"Chúng tôi có rất nhiều chuỗi trên nhiều dòng bằng cách sử dụng các chuỗi nguyên văn (chủ yếu là các câu lệnh SQL)" nghe có vẻ như bạn có rất nhiều chuỗi SQL cho phép các cuộc tấn công SQL SQL.
Cetin Basoz

1
@svick chúng tôi là, mọi thứ người dùng nhập vào đều được tham số hóa. Mặc dù vậy, chúng tôi vẫn sử dụng SQL động rất nhiều, vì chúng tôi tự động tạo SQL cho các thực thể của mình trong mã.
Keith

1
@CetinBasoz chúng tôi không - tất cả đầu vào của người dùng được tham số hóa. Có rất nhiều trường hợp bạn có SQL động - ví dụ LINQ hoặc bất kỳ khung ánh xạ đối tượng nào khác.
Keith

Câu trả lời:


194

Bạn có thể áp dụng cả hai $@tiền tố cho cùng một chuỗi:

string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";

Kể từ khi được giới thiệu trong C # 6 , các chuỗi nguyên văn nội suy phải bắt đầu bằng mã thông báo $@, nhưng bắt đầu với C # 8, bạn có thể sử dụng $@hoặc@$ .


57
Đối diện ( @$"...") không hoạt động, đưa tôi đến đây.
Sinatr

12
@Sinatr yeah, nó phải $@"..."theo thứ tự đó.
Keith

36
Thực tế $@hoạt động khi @$không, có ý nghĩa hoàn hảo khi bạn nghĩ về nó. Khi tôi bối rối về điều này, điều xảy ra thường xuyên khi tôi bắt đầu sử dụng cú pháp này, tôi luôn tự nhủ: "Nội suy chuỗi nguyên văn này" vì điều ngược lại sẽ không có ý nghĩa.
Heki

1
@RayLuo không thực sự, nhưng được cho biết các trình tuần tự .NET JSON khác nhau đã trở nên nhanh như thế nào, có lẽ bạn không nên trực tiếp mã hóa JSON.
Keith

1
Nếu áp dụng bộ đôi cho một hiện có const string, thả const.
bvj
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.