对一个字符串使用多个字符串构建器

pat*_*719 5 c# java string stringbuilder

所以我主要是C#和Java开发人员,但我想这个问题可能适用于使用StringBuilder或其衍生物的任何编程语言.

好的,所以或多或少的常识,连接即使少量的字符串也可能是主要的性能杀手(尽管这是有争议的).我的问题是,是否有人知道在字符串生成器中使用字符串生成器的性能影响.为了澄清我的意思,让我加入一些虚拟代码来帮助说明我的观点.

此外,我意识到通过调用StringBuilder的多个实例自然会有性能损失但我不相信我会调用它足以导致任何真正的性能问题.(这个假设也可能是错误的,任何意见也会有所帮助)

public string StringToGet()
{
     StringBuilder sb = new StringBuilder("Some Text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append(MethodThatCreatesAnotherString());
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append(MethodThatCreatesAnotherString());
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append(MethodThatCreatesAnotherString());
     //etc   

     return sb.toString();

}

private string MethodThatCreatesAnotherString()
{
     StringBuilder sb = new StringBuilder("Other text");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");
     sb.append("more text to add");

     return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

逻辑告诉我这不应该是一个问题,但这种方法的某些东西似乎并不适合我.任何人都可以对以下问题有所了解

  1. 与仅使用其他方法和使用单个StringBuilder相比,这是否会产生明显更大的性能影响
  2. 这是一个合理可接受的做法.

任何现场对此将非常感激.

drh*_*ris 9

通常,如果直接字符串连接的数量大于5,则最好使用StringBuilder.如果您可以控制反过来构建字符串的方法,为什么不考虑将您StringBuilder传入方法?

public void MethodThatCreatesAnotherString(StringBuilder sb)
{
   // code that appends to StringBuilder
}
Run Code Online (Sandbox Code Playgroud)

因此,当调用该函数时,您传入当前的StringBuilder,并且不会失去性能损失,但这是以潜在的混淆为代价的.

也就是说,除非你进入数百或数千个这样的操作,否则我不担心这里的过早优化.你的主要性能是必须要做两次(即在方法中附加字符串,然后附加完整的字符串),但是你仍然不会在使用+连接的程度上获得性能.

编辑:一个如何使用它的澄清示例:

string SomeMethodCreatingAString()
{
   StringBuilder sb = new StringBuilder();
   sb.append("more text to add");
   sb.append("more text to add");
   sb.append("more text to add");
   sb.append("more text to add");
   sb.append("more text to add");
   MethodThatCreatesAnotherString(sb);
   // more text
   return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

因此,您不会在第二种方法中追加该字符串,只需StringBuilder在该方法中使用相同的字符串即可.希望这是有道理的.