更新
请看这个问题:Does StringBuilder use more memory than String concatenation?。我相信丹·陶斯回答了我的问题。我想确定的是,他的回答仍然听起来,因为它是2010年?我相信这也回答了我的问题:https://coders-corner.net/2014/08/20/concatenate-strings-in-c-operator-vs-string-concat-vs-stringbuilder/
原始问题
这种方法不能使用C#:
public string getMessage()
{
string message = "Hello";
string message += " my";
string message += " name";
string message += " is";
string message += " bert";
return message;
}这样做更好:
public string getMessage()
{
StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" my");
sb.Append(" name");
sb.Append(" is");
sb.Append(" Bert");
return message.ToString();
}与第二种方法相比,这种方法如何:
public string getMessage()
{
return string.Concat("Hello", " my", " name", " is", " Bert");
}我喜欢第三种方法,因为它只是一行代码。使用第三种方法是否意味着什么?我在这里查看了.NET引用:https://referencesource.microsoft.com/#mscorlib/system/string.cs,8281103e6f23cb5c,特别是带有签名的方法:公共静态字符串连接(params String[]值)。不过,我还是想确认一下?
发布于 2018-02-14 11:13:10
这取决于你想要什么。如果您要控制2个字符串,那么这将比StringBuilder更快,因为实例化StringBuilder类有一定的开销。另一方面,如果您将100个字符串缩进比StringBuilder类快得多。之所以速度更快,是因为它使用的是缓冲区,而不是普通的字符串contatenation(字符串是不可变的)。
string.Concat()内部不使用StringBuilder,因此这个假设是错误的。
尝试查看string.Concat重载,您可能会更好地了解何时使用string.Concat和何时使用StringBuilder。您会注意到有几个过载(确切地说是10个,但让我们看看这5个)。
string.Concat(arg0)
string.Concat(arg0, arg1)
string.Concat(arg0, arg1, arg2)
string.Concat(arg0, arg1, arg2, arg3)
string.Concat(params string[])如果您在基准测试中使用所有这些方法以及StringBuilder,您会注意到,在大约4个字符串连接的某个地方,StringBuilder将起带头作用。这是因为前4个string.Concat()方法比最后一个方法更优化,后者只需要多少个参数。
有趣的是,如果您要添加另一个度量系列,但是这次是用容量实例化它的StringBuilder,而不是StringBuilder带头,因为当StringBuilder达到当前的容量上限时会有开销。
编辑:我找到了我的基准测试结果(这是2011年的一篇论文)。为了可靠性目的,完成了100,000次。轴X是用于连接的字符串数,而轴Y是持续时间。

发布于 2018-02-14 11:07:45
StringBuilder是如此的优化。这是我的考验:
static void ConcatenateWithOperator()
{
string txt = string.Empty;
for (int i = 0; i < 1000; i++)
{
txt += new string('x', i);
}
}
static void ConcatenateWithStringBuilder()
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
builder.Append(new string('x', i));
}
string result = builder.ToString();
}
static void ConcatenateWithConcat()
{
string txt = string.Empty;
for (int i = 0; i < 1000; i++)
{
txt = string.Concat(txt, new string('x', i));
}
}
static void ConcatenateWithOperator2()
{
for (int i = 0; i < 1000; i++)
{
string result = new string('x', i) + new string('x', i);
}
}
static void ConcatenateWithStringBuilder2()
{
for (int i = 0; i < 1000; i++)
{
StringBuilder builder = new StringBuilder();
builder.Append(new string('x', i));
builder.Append(new string('x', i));
string result = builder.ToString();
}
}
DateTime start1 = DateTime.Now;
ConcatenateWithOperator();
Console.WriteLine((DateTime.Now - start1).TotalSeconds);
DateTime start2 = DateTime.Now;
ConcatenateWithStringBuilder();
Console.WriteLine((DateTime.Now - start2).TotalSeconds);
DateTime start3 = DateTime.Now;
ConcatenateWithConcat();
Console.WriteLine((DateTime.Now - start3).TotalSeconds);
DateTime start4 = DateTime.Now;
ConcatenateWithOperator2();
Console.WriteLine((DateTime.Now - start4).TotalSeconds);
DateTime start5 = DateTime.Now;
ConcatenateWithStringBuilder2();
Console.WriteLine((DateTime.Now - start5).TotalSeconds);其结果是:
0,3087516 // many strings concatenated with + operator
0,0030022 // many strings concatenated with StringBuilder
0,1941643 // many strings concatenated with Concat
0,0040039 // two strings concatenated with + operator
0,004003 // two strings concatenated with StringBuilder因此,只有当您希望连接少量字符串时,+运算符作为StringBuilder才是有效的。
https://stackoverflow.com/questions/48785118
复制相似问题