19

可能重复:
String vs StringBuilder

我刚刚重温了一些我用来学习 VB.NET 的书籍。我不确定我脑子里有这个,了解 StringBuilder 是如何/是什么。

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

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

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

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

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

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

4

6 回答 6

40

我有一篇关于这个主题的文章。总结(从页面底部复制):

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

这是我的经验法则:

StringBuilder最好在编译时不知道串联的确切数量时使用。

于 2009-02-09T21:14:48.777 回答
3

Coding Horror有一篇关于这个问题的好文章,微优化剧院的悲惨悲剧

于 2009-02-09T21:19:24.150 回答
0

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

于 2009-02-09T21:17:31.813 回答
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 将有效地一次性完成所有连接。仅当您在循环中执行它们或连续连接它们时。

于 2009-02-09T21:18:44.663 回答
0

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

于 2009-02-09T21:19:38.500 回答