【发布时间】:2012-05-04 15:39:13
【问题描述】:
我本来打算在 this other SO question 上发布答案,但有人在我之前使用 StringBuilder 类,无论如何,离题了...
我知道 .NET 中的字符串是不可变的,因此创建一个字符串并对其进行修改实际上会在内存中创建两个不同的字符串,这与 StringBuilder Class 相反,它维护一个内部缓冲区并仅在 @987654326 上创建一个最终字符串@ 称呼。我也知道 .NET 实习生每个字符串,因此应用程序中使用的每个字符串只会创建一个副本。
当您将一个字符串附加到另一个字符串时,它们都在应用程序中使用,因此它们都被实习(不是吗?),不使用连接运算符附加字符串的主要原因是因为您将结束完成后会在内存中添加一大堆字符串,每个字符串都比前一个大。
我了解将01234 与56789 连接会导致内存中出现以下两个字符串:
01234
0123456789
虽然使用 StringBuilder 只会产生,因为实习:
01234
56789
显然第二种方法的性能更好,但实际上它有多好?我的意思是,如果您要从一小部分值列表中创建一个更大的字符串,我为什么要考虑StringBuilder(它本身占用内存空间)?它总是好用吗?或者对于何时 [不] 使用它有什么好的经验法则?
【问题讨论】:
-
实际上不是重复的,但这个问题确实澄清了一些东西。谢谢。
-
StringBuilder的一个目的是确保字符串连接与字符串长度成线性关系,而不是二次。您可能会发现 Eric Lippert 的回复 here 提供了丰富的信息;他的第一个基本策略是当你不使用 stringbuilder 时你会得到什么。如果您喜欢较低级别的讨论,Joel on Software 在他的文章back to basics 中从 C 的角度进行了讨论。
标签: .net string string-interning