我想知道在C#源代码中打破长字符串的“最佳实践”是什么。这是字符串
"string1"+
"string2"+
"string3"
在编译期间或运行时连接?
答案 0 :(得分:50)
它在编译时完成。这完全等同于“string1string2string3”。
假设你有:
string x = "string1string2string3"
string y = "string1" + "string2" + "string3"
编译器将执行适当的实习,使x和y引用相同的对象。
编辑:答案和评论中有很多关于StringBuilder
的讨论。许多开发人员似乎认为字符串连接始终与StringBuilder
完成。这是一种过度概括 - 值得理解why StringBuilder
is good in some situations, and not in others。
答案 1 :(得分:39)
如果空格不重要,那么可以使用@ escape字符在代码中编写多行字符串。 如果您的代码中有查询,这很有用:
string query = @"SELECT whatever
FROM tableName
WHERE column = 1";
这将为您提供包含换行符和制表符的字符串,但对于无关紧要的查询。
答案 2 :(得分:7)
您的示例将在编译时连接。所有内联字符串和const字符串变量在编译时连接在一起。
要记住的是,包括任何只读字符串将延迟连接到运行时。 string.Empty和Environment.NewLine都是只读字符串变量。
答案 3 :(得分:3)
串联在编译时完成,因此没有运行时开销。
答案 4 :(得分:1)
这实际上取决于你需要什么。通常,如果需要连接字符串,则可以使用StringBuilder实现运行时的最佳性能。 如果您在源代码中引用类似var str =“String1”+“String2”的内容,那么在编译时它将转换为字符串str =“String1String2”。在这种情况下,您没有连接开销
答案 5 :(得分:1)
StringBuilder是一个很好的方法 你有很多(超过四个) 字符串连接。它更快。
在上面的示例中使用String.Concat是在编译时完成的。 由于它们是文字字符串,因此它们由编译器进行优化。
但是如果你使用变量:
string a = "string1";
string b = "string2";
string c = a + b;
这是在运行时完成的。
答案 6 :(得分:0)
你不能使用StringBuilder
吗?
答案 7 :(得分:0)
有什么办法可以做到。 我最喜欢的是使用C#中的字符串方法。 样本一:
string s = string.Format(“{0} {1} {0}”,“Hello”,“By”); 结果是s =“Hello By Hello”;
答案 8 :(得分:0)
接下来的extension method(受通用标签oneLine方法的启发)...
using System;
using System.Text.RegularExpressions;
using static System.Text.RegularExpressions.RegexOptions;
namespace My.Name.Space
{
public static class StringHelper
{
public static string AsOneLine(this string text, string separator = " ")
{
return new Regex(@"(?:\n(?:\s*))+").Replace(text, separator).Trim();
}
}
}
...与这样使用的verbatim string literal组合:
var mySingleLineText = @"
If we wish to count lines of code, we should not regard them
as 'lines produced' but as 'lines spent'.
".AsOneLine();
请注意,字符串“内部”的空格保持不变,例如:
// foo bar hello world.
var mySingleLineText = @"
foo bar
hello world.
".AsOneLine();
如果您不希望用空格替换换行符,则将""
作为扩展方法的参数:
// foobar
var mySingleLineText = @"
foo
bar
".AsOneLine("");
请注意:由于涉及辅助方法,因此这种形式的字符串连接是在运行时进行的(与在编译时通过+
运算符进行的连接相反)在接受的答案中说明)。因此,如果性能成为问题,请使用+
。如果您要处理的是冗长的短语和可读性,并且“易用性”是重点,那么上面建议的方法可能值得考虑。
答案 9 :(得分:-3)
如果使用任意数量的字符串,StringBuilder将是您最快的方法。
http://dotnetperls.com/Content/StringBuilder-1.aspx
如果您只是做了一些字符串(5或更少是一个好规则),速度将与您正在使用的串联无关。