2010-01-02 38 views
25

假設您有一個很長的字符串(> 80個字符),您想分散在多個源代碼行中,但不希望包含任何換行符。在C#中,跨多個源代碼行傳播單行字符串文字的最佳方法是什麼?

一種選擇是連接字符串:

string longString = "Lorem ipsum dolor sit amet, consectetur adipisicing" + 
    " elit, sed do eiusmod tempor incididunt ut labore et dolore magna" + 
    " aliqua. Ut enim ad minim veniam"; 

有沒有更好的辦法,或這是最好的選擇嗎?

編輯:「最好」,我的意思是編碼器讀,寫和編輯最簡單。例如,如果您沒有想換行,這是很容易看:

string longString = 
@"Lorem ipsum dolor sit amet, consectetur adipisicing 
elit, sed do eiusmod tempor incididunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam"; 

我想知道是否有東西一樣乾淨,當你想換行。

回答

46

我會用你的方法的變化:

string longString = 
    "Lorem ipsum dolor sit amet, consectetur adipisicing " + 
    "elit, sed do eiusmod tempor incididunt ut labore et dolore magna " + 
    "aliqua. Ut enim ad minim veniam."; 

在這裏,我開始上線後的字符串等號,使他們都排隊,我也確保發生在空間該行的結尾(同樣,爲了對齊的目的)。

+0

我喜歡這種方法最好。 – 2010-01-02 02:40:28

+20

C#編譯器在編譯時合併這樣的字符串文字也很好,所以沒有與此相關的運行時成本。 – LBushkin 2010-01-02 02:44:02

+0

沒有怪異的方式! – 2010-01-02 03:19:46

-2

您可以使用多個consts,然後將它們合併成一個大的字符串:

const string part1 = "part 1"; 
const string part2 = "part 2"; 
const string part3 = "part 3"; 
string bigString = part1 + part2 + part3; 

編譯器將「摺疊」這些常數成一個大的字符串,無論如何,所以不存在運行成本在所有的這種技術與您的原始代碼示例相比。

有許多優點,以這種方法:

  1. 的子串可以在應用程序的其他部分被容易地重複使用。
  2. 如果需要,可以在多個文件或類型中定義子字符串。
+0

我編輯了我的問題,以澄清我的意思是「最好的」。 – 2010-01-02 02:40:49

10

您最初的想法可能是在您的代碼中嵌入文字字符串的最簡單方法。C# compiler merges literals concatenated with + - 所以它基本上相當於一個非常長的字符串。

另一種選擇當然是將字符串外部化爲配置文件或設置文件。這將使它更容易閱讀,更容易更改或本地化。我個人避免將長長的文本直接放到應用程序的代碼中,除非它們非常靜態,並且不需要本地化 - 內部異常消息文本等。

24

如果你想保持儘可能小的代碼並能夠輕鬆讀取,我仍然會使用@字符串。加上它的速度更快,如果你的源頭很長,

string verbatimLit = @" 
    __ __ 
/`-' \ 
/_| N |_\ Sometimes 
    | I | format in code 
    | N | matters 
    |_____| 
"; 

然後從字符串在1行中刪除換行符,

verbatimLit.Replace(Environment.NewLine, " "); 
+2

不錯的做法。雖然你不想用空格替換每個換行符嗎?否則,這裏的內容將變成'contentshere'而不是'contents here'。 (或者,可以在第一行之後加上一個空格。) – DavidRR 2014-01-23 15:56:44

6

對於SQL查詢或其他長字符串有自己的語法,我有時會做這樣的事情:

 private const string QUERY = @" 
SELECT * 
FROM Table1 AS T1 
INNER JOIN Table2 AS T2 ON T1.ID = T2.T1ID 
WHERE T1.VALUE = @P1 
GROUP BY T2.OTHERVALUE 
"; 

這會使字符串的格式保持不變。

0

當發現自己有問題要怎麼做多行字符串時,最好使用Resources文件。

+3

請顯示在資源文件中使用這些字符串的示例。 – 2010-01-02 03:47:19

0

跟着Tj Kellie回答,在C#6.0中,您可以很容易地通過一條指令來執行通過字符串插值的各種信息的串接和嵌入,並且即使在多行上定義字符串也不會有換行符。

涉及所有這些複雜的例子可以如下所示:

public int? BestTime { get; set; } 
public int? WorstTime { get; set; } 
public int? AvgTime { get; set; } 
public int TimeoutReachedCount { get; set; } 
public int AllRunCount { get; set; } 

public string Str => [email protected]" 
    Ran {AllRunCount} times; 
    Reached timeout {TimeoutReachedCount} times; 
    Best time = {(BestTime.HasValue ? BestTime.ToString() : "N/A")}; 
    Worst time = {(WorstTime.HasValue ? WorstTime.ToString() : "N/A")}; 
    Average time = {(AvgTime.HasValue ? AvgTime.ToString() :"N/A")};" 
     .Replace(Environment.NewLine, ""); 

當然,必須要特別注意使用在線路末端追加空格,以避免合併的話。

相關問題