c# - System.Text.StringBuilder 限制

标签 c# .net performance string

我读到 StringBuilder 类型有一个限制(默认为 16 个字符),当您向其附加一些文本时,超出其限制,将创建一个具有更高限制的新实例并将数据复制到它。我尝试使用以下代码:

StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",16);
test.Append("ABC");

为此生成的 CIL 是:

  .maxstack  3
  .locals init (class [mscorlib]System.Text.StringBuilder V_0)
  IL_0000:  nop
  IL_0001:  ldstr      "ABCDEFGHIJKLMNOP"
  IL_0006:  ldc.i4.s   16
  IL_0008:  newobj     instance void [mscorlib]System.Text.StringBuilder::.ctor(string, int32)
  IL_000d:  stloc.0
  IL_000e:  ldloc.0
  IL_000f:  ldstr      "ABC"
  IL_0014:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
  IL_0019:  pop
  IL_001a:  ret

将限制设置为 32:

StringBuilder test = new StringBuilder("ABCDEFGHIJKLMNOP",32);
test.Append("ABC");

生成完全相同的 IL 代码。 我期望的是在第一种情况下创建一个新实例,并在第二种情况下更改实例的值,这显然没有发生,知道为什么吗?

最佳答案

所有有趣的事情都发生在这一行中:

IL_0014:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)

这是您调用 Append() 方法的地方,但是您发布的 IL 不包含该方法的主体。查看 source code对于 StringBuilder 类(它是根据允许您查看的许可发布的),并查看 Append() 方法中发生了什么。

剧透警报! 查看 Append() 的源代码会发现,只要连接字符串的长度超过当前大小时,内部缓冲区确实会增加缓冲区。

关于c# - System.Text.StringBuilder 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074240/

相关文章:

.net - 如何使 Entity Framework 数据上下文只读

.net - 无法为具有主题备用名称证书的 SSL/TLS 安全通道建立信任关系

android - 电晕表现?

c# - 没有名为 difflib 的模块

c# - GC 会删除非静态类中的静态属性吗?

c# - Entity Framework 检查 OnModelCreating 期间是否存在列

performance - 为什么这个深度学习模型在 CPU 上的推理速度比 GPU 更快?

c# - 使用 BundlerMinifier 在 asp.net core bundle.config 中使用通配 rune 件名

c# - 创建带有心跳的任务

ios - 在 Swift 中将静态函数声明为私有(private)时的性能和安全问题