簡體   English   中英

在C#中,在多條源代碼行之間散布單行字符串文字的最佳方法是什么?

[英]In C#, what's the best way to spread a single-line string literal across multiple source lines?

假設您有一個較長的字符串(> 80個字符),您想跨多個源代碼行,但不希望包含任何換行符。

一種選擇是串聯子字符串:

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";

我想知道,當您希望使用換行符時,是否還有一樣干凈的東西。

我會使用您的方法的一種變體:

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 verbatimLit = @" 
   __   __  
  /  `-'  \ 
 /_| N   |_\  Sometimes
   |  I  |    format in code
   |   N |    matters
   |_____|  
";

然后從1行中的字符串中刪除換行符,

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

您的原始想法可能是在代碼中嵌入文字字符串的最簡單方法。 C#編譯器合並用+串聯的文字,因此它基本上等效於單個非常長的字符串。

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

對於具有自己語法的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
";

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

遵循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 => $@"
   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, "");

當然,必須格外小心在行末添加空白,以避免單詞合並。

當發現有關如何處理多行字符串的問題時,最好使用Resources文件。

您可以使用多個const,然后將它們組合成一個大字符串:

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

編譯器無論如何都會將這些常量“折疊”成一個大字符串,因此與原始代碼示例相比,此技術完全沒有運行時開銷。

這種方法有很多優點:

  1. 子字符串可以在應用程序的其他部分輕松重用。
  2. 如果需要,可以在多個文件或類型中定義子字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM