代码之家  ›  专栏  ›  技术社区  ›  spacemonkeys

何时使用StringBuilder?[副本]

  •  19
  • spacemonkeys  · 技术社区  · 16 年前

    可能重复:
    String vs StringBuilder

    我刚刚重新阅读了一些我用来学习VB.NET的书。我不确定我脑子里是否有这个想法,了解StringBuilder是什么。

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

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

    或者,当你使用它将字符串添加在一起时,你会看到性能上的好处吗?

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

    我一直觉得,声明另一个变量并包含一个命名空间对小字符串连接没有好处,但我现在不确定。

    抱歉,很多文档告诉你应该使用什么,只是没有告诉你什么是最好的。

    6 回复  |  直到 8 年前
        1
  •  36
  •   Jon Skeet    16 年前

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

    • 当你在一个非平凡的循环中连接时,一定要使用StringBuilder——尤其是如果你不确定(在编译时)你会在循环中进行多少次迭代。例如,一次读取一个文件中的一个字符,在使用+=运算符的同时构建一个字符串,这可能是性能自杀。
    • 当你可以(可读地)在一个语句中指定需要连接的所有内容时,一定要使用连接运算符。(如果你有一个数组要连接,可以考虑显式调用String.Concat,如果你需要一个分隔符,可以考虑调用String.Join。)
    • 不要害怕将文字分解为几个连接的位——结果是一样的。例如,您可以通过将长文字拆分为几行来提高可读性,而不会损害性能。
    • 如果你需要连接的中间结果,而不是为下一次连接迭代提供数据,StringBuilder将无法帮助你。例如,如果你从名字和姓氏构建一个全名,然后在末尾添加第三条信息(可能是昵称),那么只有当你不需要(名字+姓氏)字符串用于其他目的时(就像我们在创建Person对象的示例中所做的那样),你才会从使用StringBuilder中受益。
    • 如果你只有几个连接要做,并且你真的想在单独的语句中完成它们,那么你走哪条路并不重要。哪种方式更有效将取决于连接的数量、所涉及的字符串大小以及它们连接的顺序。如果你真的认为这段代码是性能瓶颈,请对其进行分析或基准测试。
        2
  •  13
  •   Andrew Hare    16 年前

    以下是我的经验法则:

    StringBuilder 当编译时连接的确切数量未知时,最好使用它。

        3
  •  3
  •   Peter Mortensen icecrime    12 年前

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

        4
  •  0
  •   Wayne Molina    16 年前

    就我个人而言,当我有不止一两个字符串要连接时,我会使用StringBuilder。我不确定是否会对性能产生真正的影响,但我一直在阅读并被告知,每次使用多个字符串进行常规连接都会创建一个额外的字符串副本,而使用StringBuilder会保留一个副本,直到您调用最终的 ToString() 方法上。

        5
  •  0
  •   Ray Hidayat    16 年前

    有人通过实验发现临界数是6。一行中有6个以上的连接,您应该使用StringBuilder。不记得我在哪里找到这个的。

    但是,请注意,如果你只是把它写在一行中:

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

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

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

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

        6
  •  0
  •   Brandon    16 年前

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