Sự khác biệt giữa một chuỗi thông thường và một chuỗi nguyên văn là gì?


166

Tôi có một phiên bản dùng thử của Resharper và nó luôn gợi ý rằng tôi chuyển các chuỗi thông thường thành các chuỗi nguyên văn. Sự khác biệt là gì?


3
Tôi chưa bao giờ thấy đề xuất này từ ReSharper. Bạn có thể đưa ra một ví dụ nơi nó gợi ý điều này?
John Saunders

3
Tôi chỉ có nó Gợi ý đầu tiên là chuyển nó sang tài nguyên, nhưng thứ hai là biến nó thành một chuỗi nguyên văn: MessageBox.Show ("Một thú mỏ vịt phải được chăm sóc trước khi công việc có thể tiến hành.");
B. Clay Shannon

Tôi vẫn nhận được nó tất cả các thời gian. Nói chung, đây là một trong những cảnh báo chia sẻ lại mà bạn muốn tắt, bởi vì nó gợi ý tạo ra các chuỗi nguyên văn mà không có lý do gì.
Dean Swiatek

Nếu bạn thích tính năng được đề xuất của tôi cho Visual Studio IDE, vui lòng upvote tại đây: Developercommunity.visualstudio.com/idea/602807/
trộm

Câu trả lời:


191

Một chuỗi nguyên văn là một chuỗi không cần phải thoát, như tên tệp:

string myFileName = "C:\\myfolder\\myfile.txt";

sẽ là

string myFileName = @"C:\myfolder\myfile.txt";

Biểu tượng @ có nghĩa là đọc chuỗi đó theo nghĩa đen và không diễn giải các ký tự điều khiển khác.


12
Tôi tự hỏi tại sao Resharper gợi ý sự thay đổi này. Có bất kỳ chuyên gia CLR nào biết nếu các chuỗi nguyên văn được xử lý hiệu quả hơn vì các ký tự thoát có thể bị bỏ qua không?
Matt Peterson

9
Tôi nghĩ có lẽ ReSharper gợi ý nó bởi vì chuỗi nguyên văn dễ đọc hơn.
andyp

36
Tôi tin rằng đó là một loại quy ước mã hóa (tôi chưa bao giờ thấy hoặc nghe thấy trước đây). Đối với các chuỗi, ReSharper đề nghị hoặc chuyển nó thành một tệp tài nguyên để bản địa hóa hoặc làm cho nó thành nguyên văn - đối với các chuỗi nguyên văn ReSharper sau đó không còn cung cấp tùy chọn để bản địa hóa chuỗi. Vì vậy, nó có vẻ như là một quy ước để làm cho tất cả các chuỗi không cần nguyên văn bản địa.
Daniel Brückner

Giả sử chúng ta có chuỗi ký tự được gán cho biến chuỗi, chuỗi myFileName = "C: \\ myfolder \\ myfile.txt"; Bây giờ, tôi muốn chuyển đổi biến chuỗi myFileName thành chuỗi nguyên văn. Tôi phải làm nó như thế nào? Nó có hoạt động không? chuỗi verbatimStr = @myFileName;
sanjeev nhiệt tình

3
@sanjeevbhusal: Bạn chưa bao giờ thực sự làm điều đó. @ "C: \ myfolder \ myfile.txt" và "C: \\ myfolder \\ myfile.txt" là những điều tương tự với CLR. Về cơ bản, nó chỉ là đường tổng hợp.
alc6379

68

Điều này được đề cập trong phần 2.4.4.5 của đặc tả C # :

2.4.4.5 Chuỗi ký tự

C # hỗ trợ hai dạng chuỗi ký tự chuỗi: chuỗi ký tự chuỗi thông thường và chuỗi ký tự chuỗi nguyên văn.

Một chuỗi ký tự thông thường bao gồm 0 hoặc nhiều ký tự được đặt trong dấu ngoặc kép, như trong "xin chào" và có thể bao gồm cả các chuỗi thoát đơn giản (chẳng hạn như \ t cho ký tự tab) và các chuỗi thoát hex và thập lục phân.

Một chuỗi ký tự nguyên văn bao gồm một ký tự @ theo sau là một ký tự trích dẫn kép, 0 hoặc nhiều ký tự và một ký tự trích dẫn kép đóng. Một ví dụ đơn giản là @ "xin chào". Trong một chuỗi nguyên văn theo nghĩa đen, các ký tự giữa các dấu phân cách được giải thích nguyên văn, ngoại lệ duy nhất là một chuỗi trích dẫn thoát. Cụ thể, các chuỗi thoát đơn giản và các chuỗi thoát thập lục phân và Unicode không được xử lý theo nghĩa đen của chuỗi. Một chuỗi nguyên văn có thể kéo dài nhiều dòng.

Nói cách khác, ký tự đặc biệt duy nhất trong @ "nguyên văn chuỗi ký tự" là ký tự trích dẫn kép. Nếu bạn muốn viết một chuỗi nguyên văn có chứa một trích dẫn kép, bạn phải viết hai dấu ngoặc kép. Tất cả các nhân vật khác được giải thích theo nghĩa đen.

Bạn thậm chí có thể có các dòng mới theo nghĩa đen trong một chuỗi nguyên văn. Trong một chuỗi ký tự thông thường, bạn không thể có các dòng mới theo nghĩa đen. Thay vào đó bạn phải sử dụng ví dụ "\n".

Nguyên văn chuỗi ký tự thường rất hữu ích để nhúng tên tệp và biểu thức chính quy trong mã nguồn, bởi vì dấu gạch chéo ngược trong các loại chuỗi này là phổ biến và sẽ cần phải thoát nếu sử dụng một chuỗi ký tự thông thường.

Không có sự khác biệt trong thời gian chạy giữa các chuỗi được tạo từ các chuỗi ký tự thông thường và các chuỗi được tạo từ một chuỗi ký tự nguyên văn - cả hai đều thuộc loại System.String.


27

Không có sự khác biệt về thời gian chạy giữa một chuỗi và chuỗi nguyên văn. Chúng chỉ khác nhau ở thời gian biên dịch. Trình biên dịch chấp nhận các chuỗi thoát ít hơn trong một chuỗi nguyên văn, vì vậy những gì bạn-thấy-là-những gì bạn nhận được ngoài một lối thoát trích dẫn.

Bạn cũng có thể sử dụng ký tự nguyên văn, @, để báo cho trình biên dịch coi từ khóa là tên:

var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);

var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);

16

Bạn cũng có thể có chuỗi nhiều dòng bằng cách sử dụng chuỗi nguyên văn:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

không có @bạn có một lỗi.

Trong VB14 có một tính năng mới được gọi Multiline Strings, nó giống như các chuỗi nguyên văn trong C #.

Chuỗi đa dòng

Mẹo chuyên nghiệp: Các chuỗi ký tự VB bây giờ chính xác như các chuỗi nguyên văn C #.


13

Các chuỗi thông thường sử dụng các chuỗi thoát đặc biệt để dịch sang các ký tự đặc biệt.

/*
This string contains a newline
and a tab    and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");

Các chuỗi nguyên văn được hiểu như là, mà không dịch bất kỳ chuỗi thoát nào:

/* 
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");

0

Nếu bạn muốn xóa cảnh báo Chia sẻ lại, bạn có thể sử dụng:

Localizable(false)

Đối với những thứ như tham số, vị trí tập tin, ví dụ. đây có thể là một giải pháp tốt

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.