在C#中,跨多个源代码行传播单行字符串文字的最佳方法是什么?

时间:2010-01-02 02:30:33

标签: c# string coding-style

假设您有一个冗长的字符串(> 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";

当你想要换行时,我想知道是否有一些干净的东西。

7 个答案:

答案 0 :(得分:52)

我会使用您方法的变体:

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

这里我在等号后面的行上开始字符串,这样它们都排成一行,我也确保空格出现在行的末尾(同样,为了对齐)。

答案 1 :(得分:30)

如果你想尽可能地保持代码的最小化并且能够轻松地阅读它,我仍然会使用@ literal字符串。如果你的来源很长而且速度更快......

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

然后从1行

中删除字符串中的换行符
verbatimLit.Replace(Environment.NewLine, " ");

答案 2 :(得分:11)

您最初的想法可能是在代码中嵌入文字字符串的最简单方法。 C# compiler merges literals concatenated with + - 所以它基本上等同于一个非常长的字符串。

另一个选择当然是将字符串外部化为配置文件或设置文件。这将使其更容易阅读,更容易更改或本地化。我个人避免将长行文本直接放入应用程序的代码中,除非它们非常静态且不需要本地化 - 内部异常消息文本等。

答案 3 :(得分:7)

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

这使得字符串的格式保持不变。

答案 4 :(得分:1)

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

当然,必须特别注意在行尾添加空格以避免单词合并。

答案 5 :(得分:0)

当发现自己有关如何进行多行字符串的问题时,您最好使用资源文件。

答案 6 :(得分:-3)

您可以使用多个consts,然后将它们组合成一个大字符串:

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

无论如何,编译器会将这些常量“折叠”成一个大字符串,因此与原始代码示例相比,此技术根本没有运行时成本。

这种方法有许多优点:

  1. 子串可以很容易地在应用程序的其他部分重用。
  2. 如果需要,可以在多个文件或类型中定义子字符串。