"string1"+
"string2"+
"string3"
编译期间还是运行时拼接?
这是在编译时完成的。这与 "string1string2string3" 完全等效。
假设您有:
string x = "string1string2string3"
string y = "string1" + "string2" + "string3"
如果空格不重要,你可以使用@转义字符在代码中编写多行字符串。 如果您在代码中有一个查询,这非常有用,例如:
string query = @"SELECT whatever
FROM tableName
WHERE column = 1";
这将给你一个带有换行符和制表符的字符串,但对于一个查询来说并不重要。
您的示例将在编译时进行连接。所有内联字符串和const字符串变量都会在编译时连接。
需要记住的是,包含任何只读字符串将延迟到运行时进行连接。string.Empty和Environment.NewLine都是只读字符串变量。
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();
}
}
}
...与原样字符串字面值结合使用,用法如下:
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("");
+
运算符在编译时发生的连接形式相反,如接受的答案中所述)。因此,如果性能是一个问题,请选择+
。如果您处理的是长语句并且可读性和“易用性”是重点,则上面建议的方法可能值得考虑。这取决于你的需求。一般来说,如果你需要拼接字符串,在运行时获得最佳性能的方法是使用StringBuilder。 如果你在源代码中引用类似 var str = "String1"+"String2" 的内容,它将在编译时转换为字符串 str = "String1String2"。在这种情况下,你就没有任何拼接开销。
如果您要连接许多(超过四个)字符串,那么使用StringBuilder是一个不错的选择。它速度更快。
在上面的示例中,使用String.Concat是在编译时完成的。由于它们是字面字符串,所以编译器对它们进行了优化。
但是,如果您使用变量:
string a = "string1";
string b = "string2";
string c = a + b;
这是在运行时完成的。
你不能使用 StringBuilder
吗?
有很多方法可以实现。 我的最爱是使用 C# 中的字符串方法。 例如:
string s=string.Format("{0} {1} {0}","Hello","By"); 结果为 s="Hello By Hello";
如果你在使用任何数量的字符串,那么StringBuilder会是你最快的选择。
http://dotnetperls.com/Content/StringBuilder-1.aspx
如果你只是处理几个字符串(5个或更少是一个好的规则),使用哪种连接方式速度并不重要。
@
时,你需要始终使用双引号而不是斜杠("") 来转义引号,例如@"hello ""{name}"", how are you";
参见:https://dev59.com/AnRB5IYBdhLWcg3wro2B#556141。 - Felix K.