什么时候使用StringBuilder?

我明白了StringBuilder的好处。

但是,如果我想连接2个string,那么我认为没有StringBuilder就更好(更快)。 它是否正确?

什么时候(string的数量)使用StringBuilder变得更好?

我热烈地build议你阅读杰夫·阿特伍德(Jeff Atwood) 的“微型优化剧院的悲伤悲剧”

它把简单连接与StringBuilder与其他方法。

现在,如果你想看到一些数字和graphics,请点击链接;)

但是,如果我想分解2个string,那么我认为没有StringBuilder就更好(更快)。 它是否正确?

这确实是正确的,你可以find为什么完全解释:

http://www.yoda.arachsys.com/csharp/stringbuilder.html

总结一下:如果你能一气呵成地串起string就好

var result = a + " " + b + " " + c + .. 

你最好没有stringbuilder只做复制(预先计算结果string的长度);

对于结构像

 var result = a; result += " "; result += b; result += " "; result += c; .. 

每次创build新的对象,所以你应该考虑StringBuilder。

最后,文章总结了这些经验法则:

经验法则

那么,什么时候应该使用StringBuilder,什么时候应该使用string连接运算符?

  • 当你在一个非平凡的循环中进行连接时,肯定会使用StringBuilder,特别是如果你不知道(在编译时)肯定会在循环中做多less次迭代。 例如,一次读取一个字符文件,在使用+ =运算符时build立一个string可能会自杀。

  • 当你可以(可读地)指定需要在一个语句中连接的所有东西时,绝对使用连接运算符。 (如果你有一系列要连接的东西,可以考虑明确地调用String.Concat,或者如果你需要一个分隔符,则可以使用String.Join。)

  • 不要害怕把文字分成几个连接的比特 – 结果是一样的。 您可以通过将长文字分成几行来帮助提高可读性,例如,不损害性能。

  • 如果你需要连接的中间结果,而不是连接下一个迭代,StringBuilder不会帮你。 例如,如果你从名字和姓氏build立一个完整的名字,然后添加第三条信息(绰号,也许)到最后,你将只受益于使用StringBuilder,如果你不需要(名字+姓氏)string用于其他目的(正如我们在创buildPerson对象的示例中所做的那样)。

  • 如果你只是有几个连接,你真的想在不同的声明中做,他们走哪条路并不重要。 哪种方式更有效率将取决于所涉及的string的大小,以及它们串联的顺序的连接数量。如果您确实认为这段代码成为性能瓶颈,则可以通过两种方式进行configuration文件或基准testing。

不是真的…如果你连接大的string或者你有很多连接,就像循环一样,你应该使用StringBuilder。

System.String是一个不可变的对象 – 这意味着每当你修改它的内容,它将分配一个新的string,这需要时间(和内存?)。 使用StringBuilder,您可以修改对象的实际内容,而无需分配新的内容。

所以当你需要对string进行很多修改的时候使用StringBuilder。

但是,如果我想分解2个string,那么我认为没有StringBuilder就更好(更快)。 它是否正确?

是。 但更重要的是,在这种情况下使用香草strings 可读性要高得多。 另一方面,在循环中使用它是有意义的,并且可以像串联一样可读。

我会警惕那些将特定数量的连接作为阈值的经验法则。 在循环(仅循环)中使用它可能同样有用,更易于记忆并更有意义。

没有确定的答案,只有经验法则。 我个人的规则是这样的:

  • 如果连接在一个循环中,总是使用一个StringBuilder
  • 如果string很大,请使用StringBuilder
  • 如果连接代码在屏幕上是整洁和可读的,那么它可能是好的。
    如果不是,请使用StringBuilder

解释

那么,你要数到三,不多,不less。 你要计算的数字是三个,计数的数目是三个。 4你不算数,也不算数,除了你三。 一旦到达第三个数字,那么就把你的圣手安提阿手榴弹

我通常使用string生成器来处理任何可能导致三个或更多string连接的代码块。

只要你可以物理地键入连接的数量(a + b + c …),它不应该有很大的不同。 N平方(N = 10)是100倍放缓,不应该太差。

最大的问题是当你连接数百个string时。 在N = 100时,你会得到10000倍的放缓。 这很糟糕。

我不认为在什么时候使用或什么时候不使用之间有一个很好的界限。 当然,除非有人进行了一些广泛的testing,才能拿出金色的条件。

对我来说,如果连接2个巨大的string,我不会使用StringBuilder。 如果有一个不确定的计数循环,我很可能,即使循环可能是小计数。

  • 如果你在循环中连接string,你应该考虑使用StringBuilder而不是普通的String
  • 如果是单一连接,则可能根本看不到执行时间的差异

这里是一个简单的testing应用程序来certificate这一点:

 class Program { static void Main(string[] args) { const int testLength = 30000; var StartTime = DateTime.Now; //TEST 1 - String StartTime = DateTime.Now; String tString = "test string"; for (int i = 0; i < testLength; i++) { tString += i.ToString(); } Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString()); //result: 2000 ms //TEST 2 - StringBuilder StartTime = DateTime.Now; StringBuilder tSB = new StringBuilder("test string"); for (int i = 0; i < testLength; i++) { tSB.Append(i.ToString()); } Console.WriteLine((DateTime.Now - StartTime).TotalMilliseconds.ToString()); //result: 4 ms Console.ReadLine(); } } 

结果:

  • 30'000次迭代

    • string – 2000毫秒
    • StringBuilder – 4毫秒
  • 1000次迭代

    • string – 2毫秒
    • StringBuilder – 1毫秒
  • 500次迭代

    • string – 0毫秒
    • StringBuilder – 0毫秒

单个连接不值得使用一个stringbuilder。 我通常使用5个连接作为一个经验法则。