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ì?
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ì?
Câu trả lời:
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.
Đ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
.
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);
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 #.
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 #.
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\\.");