1

我打算就这个其他 SO 问题发表一个答案,但有人在我前面使用 StringBuilder 类,无论如何,离题了......

我知道 .NET 中的字符串是不可变的,因此创建字符串并对其进行修改实际上会在内存中创建两个不同的字符串,这与StringBuilder Class维护内部缓冲区并仅在ToString()调用时创建最终字符串相反。我也知道 .NET 实习生每个字符串,所以只会为应用程序中使用过的每个字符串创建一个副本。

当您将一个字符串附加到另一个字符串时,它们都在应用程序中使用,因此它们都被实习了(不是吗?),不使用连接运算符附加字符串的主要原因是因为您最终会得到一个完成后内存中的一整串字符串,每个都比前一个大。

我知道连接01234with56789会导致内存中出现以下两个字符串:

01234
0123456789

在使用StringBuilderwill only 时,由于实习:

01234
56789

显然第二种方法对性能更好,但实际上有多好?我的意思是,如果您要从一小部分值列表中创建一个更大的字符串,我为什么要考虑StringBuilder(本身占用内存空间)?总是好用吗?或者对于何时[不]使用它有什么好的经验法则?

4

1 回答 1

3

我也知道 .NET 实习生每个字符串

不,你对实习有错误的想法。例如,当您通过连接创建新字符串时,运行时不会搜索内部字符串表以查看是否存在匹配项。这将是非常低效的,过多的 cpu 周期对于 GC 堆空间的非常适度的节省。

在常规 .NET 应用程序中实习的唯一字符串是从一开始就作为实习生的字符串。编译器从源代码中的文字创建并添加到程序集元数据中的字符串表中的那些。您可以使用 String.Intern() 方法显式地实习字符串,但这是非常罕见的事情。

您使用 StringBuilder 来避免生成太多寿命很短的临时字符串。

于 2012-04-24T01:33:25.140 回答