【问题标题】:String immutability and interning in .net.net 中的字符串不变性和实习
【发布时间】:2012-05-04 15:39:13
【问题描述】:

我本来打算在 this other SO question 上发布答案,但有人在我之前使用 StringBuilder 类,无论如何,离题了...

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

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

我了解将0123456789 连接会导致内存中出现以下两个字符串:

01234
0123456789

虽然使用 StringBuilder 只会产生,因为实习:

01234
56789

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

【问题讨论】:

  • 实际上不是重复的,但这个问题确实澄清了一些东西。谢谢。
  • StringBuilder 的一个目的是确保字符串连接与字符串长度成线性关系,而不是二次。您可能会发现 Eric Lippert 的回复 here 提供了丰富的信息;他的第一个基本策略是当你不使用 stringbuilder 时你会得到什么。如果您喜欢较低级别的讨论,Joel on Software 在他的文章back to basics 中从 C 的角度进行了讨论。

标签: .net string string-interning


【解决方案1】:

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

不,你对实习有错误的想法。当您通过连接创建一个新字符串时,运行时not 会在内部字符串表中寻找是否可能存在匹配项。这将是非常低效的,过多的 cpu 周期对于 GC 堆空间的非常有限的节省。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多