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

Mat*_*hew 40 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";
Run Code Online (Sandbox Code Playgroud)

有更好的方法,还是这是最好的选择?

编辑:通过"最佳",我认为编码人员最容易阅读,编写和编辑.例如,如果您确实需要换行符,则很容易看到:

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";
Run Code Online (Sandbox Code Playgroud)

我想知道,如果有什么一样干净,当你希望换行.

bob*_*mcr 55

我会使用你的方法的变体:

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.";
Run Code Online (Sandbox Code Playgroud)

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

  • C#编译器在编译时合并这样的字符串文字也很好,因此没有与此相关的运行时成本. (24认同)
  • 道,老兄.-------------- (14认同)

Tj *_*lie 35

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

string verbatimLit = @" 
   __   __  
  /  `-'  \ 
 /_| N   |_\  Sometimes
   |  I  |    format in code
   |   N |    matters
   |_____|  
";
Run Code Online (Sandbox Code Playgroud)

然后从1行中删除字符串中的换行符,

verbatimLit.Replace(Environment.NewLine, " ");
Run Code Online (Sandbox Code Playgroud)

  • 好方法.虽然你不想用空格替换每个换行符吗?否则,`contents <newline> here`将成为`contentshere`而不是`contents here`.(或者,可以在第一行之后用空格添加每行.) (2认同)

LBu*_*kin 12

您最初的想法可能是在代码中嵌入文字字符串的最简单方法.C#编译器,融合了级联文字+ -因此它本质上等同于一个很长的字符串.

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


Joh*_*ers 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
";
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*xei 5

接下来的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, "");
Run Code Online (Sandbox Code Playgroud)

当然,必须格外小心在行尾附加空格以避免单词合并。