2010-01-02 44 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, ""); 

当然,必须要特别注意使用在线路末端追加空格,以避免合并的话。

相关问题