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

何时使用StringBuilder?[复制品]

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

    可能重复:
    String vs StringBuilder

    我刚刚翻阅了一些我以前在vb.net上读过的书。我不确定我脑子里有这个,不知道StringBuilder是什么。

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

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

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

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

    我一直觉得声明另一个变量并包含一个名称空间对于小的字符串连接是不有利的,但我现在不确定。

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

    6 回复  |  直到 12 年前
        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 年前
        4
  •  0
  •   Wayne Molina    16 年前

    就个人而言,当我有不止一个或两个要连接的字符串时,我使用StringBuilder。我不确定是否会获得真正的性能冲击,但我一直阅读并被告知,每次使用多个字符串进行常规连接时,都会创建一个额外的字符串副本,而使用StringBuilder会保留一个副本,直到调用final 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。