什么时候使用StringBuilder?

时间:2009-02-09 21:13:17

标签: vb.net string stringbuilder

  

可能重复:
  String vs StringBuilder

我刚刚回顾了一些我曾经拿过VB.NET的书。我不确定我是否已经掌握了这一点,了解StringBuilder是如何/是什么。

使用指南是什么?如果要连接2个字符串或50个字符串,最好使用它吗?

或者当字符串总长度大于128个字符时?

或者,只要您使用它来将字符串添加到一起,您会看到性能优势吗?

在哪种情况下使用StringBuilder实例构建SQL语句比string.format("Select * from x where y = {0}",1)更好?

总是让我感到震惊的是,声明另一个变量并包含名称空间对小字符串连接不利,但我现在不确定。

很抱歉,很多文档都会告诉您使用什么,而不是最好的。

6 个答案:

答案 0 :(得分:36)

我有一个article on this very topic。总之(从页面底部复制):

  • 当您在一个非平凡的循环中连接时,绝对使用StringBuilder - 特别是如果您不确定(在编译时)您将通过循环进行多少次迭代。例如,一次读取一个文件,使用+ =运算符构建一个字符串可能会导致性能自杀。
  • 当你可以(可读地)指定需要在一个语句中连接的所有内容时,绝对使用连接运算符。 (如果你有一系列要连接的东西,可以考虑显式调用String.Concat - 如果需要分隔符,可以调用String.Join。)
  • 不要害怕将文字分成几个连接位 - 结果将是相同的。例如,您可以通过将长文字分成几行来提高可读性,而不会损害性能。
  • 如果您需要连接的中间结果而不是提供下一次连接迭代,StringBuilder不会帮助您。例如,如果你从名字和姓氏建立一个全名,然后在最后添加第三条信息(昵称,也许),你只会受益于使用StringBuilder,如果你不这样做需要(名字+姓氏)字符串用于其他目的(正如我们在创建Person对象的示例中所做的那样)。
  • 如果您只是要进行一些连接,并且您真的想在单独的语句中进行这些连接,那么您走哪条路并不重要。哪种方式更有效将取决于所涉及的字符串大小的串联数量,以及它们连接的顺序。如果您确实认为该段代码是性能瓶颈,则可以两种方式进行配置或基准测试。

答案 1 :(得分:13)

这是我的经验法则:

  

StringBuilder最好在编译时未知确切的连接数时使用。

答案 2 :(得分:3)

Coding Horror有一篇关于这个问题的好文章, The Sad Tragedy of Micro-Optimization Theater

答案 3 :(得分:0)

我个人使用StringBuilder时,我不仅要连接一个或两个字符串。我不确定是否有真正的性能提升,但我总是阅读并被告知,每次执行时,使用多个字符串进行常规连接会创建一个额外的字符串副本,而使用StringBuilder时会保留一个复制,直到你调用最终的ToString()方法。

答案 4 :(得分:0)

有人在实验中发现关键数字是6.连续超过6个连接,你应该使用StringBuilder。不记得我在哪里找到了这个。

但请注意,如果你只是写一行:

"qwert" + "yuiop" + "asdf" + "gh" + "jkl;" + "zxcv" + "bnm" + ",."

它被转换为一个函数调用(我不知道如何在VB.net中编写它)

String.Concat("qwert", "yuiop", "asdf", "gh", "jkl;", "zxcv", "bnm", ",.");

因此,如果你在一行上进行所有连接,那么不要打扰StringBuilder,因为String.Concat有效地将一次性完成所有连接。只有当你在循环中或连续连接时才这样做。

答案 5 :(得分:0)

我的规则 - 当您在For或Foreach循环中添加字符串时,请使用StringBuilder。