2012-08-30 32 views
6

Tôi bắt đầu học C# và tôi không hiểu tại sao các chuỗi ký tự thông thường (tức là, " ") không được chứa các ký tự dòng mới. (Tôi không nói về chuỗi thoát \n). Tôi biết rằng bạn phải sử dụng các chuỗi chữ đúng nguyên văn (tức là, @" ") cho các chuỗi nhiều dòng, nhưng tại sao?Tại sao các chuỗi không đúng nguyên văn có chứa dòng mới?

regular string produces "Newline in constant" errorverbatim string produces no error

Tôi đã không nhìn thấy nó quy định rõ ràng rằng bạn không thể sử dụng chúng trong chuỗi thông thường. Hơn thế nữa, ngoại trừ việc nó được đề cập đến khi tôi có thể sử dụng chuỗi nguyên văn cho điều này, mọi thứ tôi đã đọc dường như gợi ý rằng các ký tự dòng mới sẽ được cho phép trong các chuỗi ký tự thông thường.

Beginning Visual C# 2010Code: Generating Multiline String Literals (Visual C#) hiển thị ví dụ về chuỗi nhiều dòng nguyên bản mà không giải thích thêm.

Learning C# 3.0 nói điều này:

Trong ngôn ngữ C#, không gian, các tab, và dòng mới được coi là khoảng trắng .... tắm trắng thường bị bỏ qua trong C# báo cáo. ... Ngoại lệ đối với quy tắc này là khoảng trống trong chuỗi được coi là chữ; nó không bị bỏ qua.

Vì vậy, nó là chữ? Đó là điều tôi mong đợi, nhưng không phải vậy.
Nó thậm chí bao gồm hộp này tip:

Mẹo
lập trình Visual Basic lưu ý: trong C#, dòng end-of-không có ý nghĩa đặc biệt. Các câu lệnh được kết thúc bằng dấu chấm phẩy, chứ không phải ký tự mới. Không có ký tự tiếp tục dòng vì không cần ký tự.

(Tôi nhận ra rằng đây là nói về bên ngoài của dây, nhưng tại sao sẽ kết thúc-of-line có đặc biệt phân tích ý nghĩa bên một chuỗi nếu nó không ngoài một chuỗi?)

Có cuối cùng đã tìm được đường đến chính bản thân số string (C# Reference), tôi vẫn không thu được thông tin chi tiết nào:

Chuỗi ký tự có thể chứa bất kỳ ký tự nào. Trình tự thoát được bao gồm. Ví dụ sau sử dụng trình tự thoát \\ cho dấu gạch chéo ngược, \u0066 cho chữ cái f và \n cho dòng mới.

Nó nói rằng chuỗi thoát thể được sử dụng, nhưng nó không nói rằng họ phải được sử dụng. Các ký tự dòng chữ mới không có trong "bất kỳ ký tự chữ" nào không? Nếu tôi có một chuỗi chứa ký tự tab theo nghĩa đen thay vì chuỗi thoát của nó \t thì không có lỗi. Nhưng nếu tôi có một dòng mới, tôi sẽ gặp lỗi. Tôi thậm chí đã thay đổi kết thúc dòng của tệp từ \r\n thành \n hoặc \r không có hiệu lực.


Rõ ràng, tôi có thể suy ra từ các ví dụ và từ lỗi Visual Studio rằng một chuỗi nguyên văn là cần thiết nếu nó chứa một ký tự xuống dòng theo nghĩa đen, nhưng tất cả những gì tôi đã đọc cho thấy rằng không phải là trường hợp . Tại sao sự khác biệt?

+0

Tôi nghĩ rằng đây có lẽ là một trong những thứ "vì đó là cách ngôn ngữ hoạt động" .. Nó có lẽ được lấy cảm hứng từ các ngôn ngữ khác mà các lập trình viên C# mới sẽ đến. Như bạn đã đề cập, bạn có thể sử dụng tiền tố @ để xác định hằng số chuỗi nguyên văn. –

+0

@MikeChristensen Oh yeah, và tôi đã cố gắng thoát khỏi dòng mới bằng chữ với dấu gạch chéo ngược như tôi đã thấy trong C/C++. Không may mắn ở đó. – Wiseguy

Trả lời

5

Vâng, quay. Ngay khi tôi gửi bài này, tôi đã tìm thấy câu trả lời.

Ký tự dòng mới không được bao gồm trong "bất kỳ ký tự chữ" nào?

Dường như, không, không.

2.4.4.4 Character literals:

ký tự chữ:

'nhân vật'

nhân vật:

đơn ký tự

ký tự duy nhất:

Bất kỳ nhân vật ngoại trừ '(U + 0027), \ (U + 005C), và mới dòng ký tự

+0

Vâng. Nhưng tại sao không phải là ký tự dòng mới được bao gồm trong các ký tự chữ? –

+0

@ZaidMasud Lựa chọn thiết kế ngôn ngữ nằm ngoài phạm vi câu hỏi của tôi. Phản đối của tôi đơn giản là đặc điểm này không được xác định rõ ràng, mà thực tế, nó rõ ràng là vậy. – Wiseguy

+0

Có đặc điểm kỹ thuật là nhất quán. Thêm một chút tò mò về phía tôi. –

1

có khả năng dupe của Why must C/C++ string literal declarations be single-line?

Tóm lại, vì ngôn ngữ C không hỗ trợ ngôn ngữ đó.

Một lỗi đánh máy để lại một chuỗi không được khai báo sẽ xóa phần còn lại của tệp dưới dạng một mã thông báo, để lại trình lập trình với thông báo lỗi trình biên dịch dọc theo dòng "mong đợi dấu chấm phẩy tại dòng xxx, cột yyy" vị trí được chỉ định là phần cuối của tệp nguồn.

Chủ yếu là bạn không sử dụng chữ nhiều dòng. Tốt hơn là làm cho chúng rõ ràng từ góc độ UX.

Hơn nữa, trong môi trường bị hạn chế ngôn ngữ C được phát triển trong (8K PDP-11?), Tôi nghi ngờ rằng loại tràn có thể làm hỏng trình biên dịch.

C ngôn ngữ không hỗ trợ nối theo nghĩa đen, tuy nhiên, đó là hữu ích:

char *txt = "this is line 1\n" 
      "this is line 2\n" 
      "this is line 3\n" 
      ; 

Nó cũng hỗ trợ dòng nối:

char *txt = "this is my\n\ 
multi-line string literal\n\ 
isn't it nice?\n" ; 

Đặc điểm mà tôi muốn C# đã có.

+0

Vâng, tôi đã thử ghép nối, không có kết quả. Có một chút ngạc nhiên bởi điều đó kể từ đó, nếu giới hạn được thừa kế từ tổ tiên của gia đình C, tôi đã đoán nó sẽ thừa hưởng điều đó. – Wiseguy

+0

Vâng, loại cảm giác nối giống như nó nên ở đó. Thực tế người ta có thể nối với '+' có lẽ được xem là loại bỏ nhu cầu. –

1

C# (cùng với C++, C, Java, mà ảnh hưởng cú pháp của nó) có một quy tắc rất đơn giản cho khoảng trắng:

Bạn có thể làm những gì bạn muốn với nó.

Tùy chọn này cho phép sử dụng định dạng mọi thứ mà bạn muốn vì lợi ích của khả năng đọc. Bây giờ, một fan hâm mộ Python có thể nói rằng lợi thế được đánh giá cao, nhưng nó là một lợi thế, mà chúng tôi làm cho việc sử dụng.

Dòng mới trong chuỗi có thể làm hỏng điều đó. Tất cả các moreso nếu bạn không chắc chắn liệu xuống dòng trong nguồn nên có nghĩa là chúng ta chèn "\u000D", "\u000A", "\u000A\u000D", "\u0085", "\u000B", "\u000C", "\u2028" hoặc "\u2029" thành chuỗi, tất cả đều có ngữ nghĩa xuống dòng và bốn đầu đó là "cách duy nhất để làm dòng mới của hệ thống, mọi người khác là sai".

Bạn vẫn có thể cho rằng nhược điểm của việc cho phép nó bị đánh giá quá cao. C# hiện - sau tất cả, dạng chuỗi là không phải là vì mọi người có thể mong đợi từ C++, v.v. không cho phép.

+0

Tôi đã tìm ra "có vấn đề gì?" miễn là chuỗi cuối cùng được chấm dứt với một trích dẫn kết thúc (ví dụ như trường hợp với PHP), nhưng điểm tốt về sự mơ hồ của dòng kết thúc. – Wiseguy

Các vấn đề liên quan