2012-08-30 120 views
6

我開始學習C#,我不明白爲什麼規則字符串(即" ")不能包含文字換行字符。 (我不是在談論轉義序列\n)。我知道你必須爲多行字符串使用逐字字符串文字(即@" "),但爲什麼?爲什麼非字母字符串不能包含換行符?

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

我從來沒見過它明確指出,你不能按照固定字符串中使用它們。除此之外,除了傳遞中提到我可以使用逐字字符串的情況外,我所讀過的所有內容似乎都表明,常規字符串文字中允許使用字面換行符。

Beginning Visual C# 2010Code: Generating Multiline String Literals (Visual C#)顯示逐字多行字符串的示例,沒有進一步解釋。

Learning C# 3.0這樣說:

在C#語言,空格,製表符,和換行被認爲是空白....多餘的空格在C#中的語句通常被忽略。 ... 此規則的例外是字符串內的空白符被視爲文字;它不會被忽略。

所以它的文字?這也是我期望的,但事實並非如此。
它甚至包括這個提示框:

提示
Visual Basic程序員注意:在C#中,最終的行沒有特殊的意義。語句以分號結尾,而不是換行符。沒有連續字符,因爲不需要。

(我知道這是在談論字符串之外,但如果它不是一個字符串之外,爲什麼會結束的行具有特殊的意義解析裏面一個字符串?)

有終於找到我自己的方式去了string (C# Reference)本人,我仍然沒有洞察力:

字符串文字可以包含任何字符文字。包括逃逸序列。下面的示例使用轉義序列爲新行\\反斜槓,\u0066爲信f和\n

它說,可以使用轉義序列,但它並沒有說他們必須使用。字面換行符不包含在「任何字符文字」中嗎?如果我有一個包含字面製表符而不是其轉義序列\t的字符串,則不會出現錯誤。但是如果我有一個字面換行符,我會得到一個錯誤。我甚至已經修改了文件的行結束從\r\n\n\r沒有效果。


很顯然,我可以從實例,並從它是否包含文字換行字符需要逐字字符串Visual Studio中的錯誤推斷,但一切我讀過表明,不應該是這樣的。爲什麼區別?

+0

我認爲這可能是其中一種「因爲這就是語言如何工作」的事情。它可能是受其他語言的啓發,新的C#程序員會來自這些語言。正如你所提到的,你可以使用@前綴來定義一個逐字串常量。 –

+0

@MikeChristensen哦,是的,我試着用像我在C/C++中看到的反斜線轉義字面換行符。那裏也沒有運氣。 – Wiseguy

回答

5

好吧,拍。正當我提交這個時,我找到了答案。

文字換行符不包含在「任何字符文字」中嗎?

顯然,不,他們不是。

2.4.4.4 Character literals

字符字面:

'字符'

字符:

單字符

單字符:

除了任何字符'(U + 0027),\(U + 005C),和新行字符

+0

是的。但爲什麼字符文字中不包含新行字符? –

+0

@ZaidMasud語言設計選擇遠遠超出了我的問題範圍。我的反對意見僅僅是這個特徵沒有明確的界定,實際上它顯然是。 – Wiseguy

+0

是的規格是一致的。對我而言,更多是一種好奇的思考。 –

1

可能的重複的Why must C/C++ string literal declarations be single-line?

簡而言之,因爲C語言不支持它。

使字符串文字未關閉的拼寫錯誤會將文件的其餘部分淹沒爲單個標記,使程序員在編譯時出現錯誤消息,沿着「預計在xxx行,列yyy處出現分號」的位置指定的位置是源文件的結尾。

大多數情況下,您不使用多行文字。更好的是從用戶體驗角度來明確它們。另外,在約束環境中,C語言是在(8K PDP-11?)中開發的,我懷疑這種溢出可能會導致編譯器崩潰。

C語言不支持文字剪接,雖然,這是有幫助的:

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

它還支持線拼接:

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

特點,我希望C#有。

+0

是的,我嘗試拼接,無濟於事。對此有點驚訝,因爲如果限制是從C族祖先繼承的,我認爲它也會繼承。 – Wiseguy

+0

是的,拼接感覺應該在那裏。可以用'+ +連接的事實可能被視爲消除了需求。 –

1

C#(用C++,C,Java,它影響了其語法一起)有空格一個非常簡單的規則:

你可以做你想做的事情是什麼。

這讓我們可以使用格式化的東西,但爲了可讀性的目的,您想要的。現在,一位Python粉絲可能會說優勢被高估了,但這是我們利用的一個優勢。

字符串換行符可能會搞砸了。如果你不知道在源換行是否意味着我們插入全moreso "\u000D""\u000A""\u000A\u000D""\u0085""\u000B""\u000C""\u2028""\u2029"成字符串,所有這些都換行語義和前四這是不同系統的「唯一的換行方式,其他人都是錯誤的」。

你仍然可以認爲允許它的缺點被高估了。 C#確實 - 人們可能期望從C++等中得到而不是的字符串形式。確實允許允許它。

+0

我想「它有什麼關係?」只要字符串最終以一個結束引號結尾(例如PHP的情況就是如此),但關於行結尾的歧義性的好處。 – Wiseguy

相關問題