代码之家  ›  专栏  ›  技术社区  ›  Matt Lacey

StringBuilder的默认容量

  •  31
  • Matt Lacey  · 技术社区  · 17 年前

    A的默认容量是多少 StringBuilder ?

    什么时候应该(或者不应该)使用默认值?

    8 回复  |  直到 8 年前
        1
  •  4
  •   endian    17 年前

    尊敬的J.Skeet先生准确地分析了这个问题:

    http://www.yoda.arachsys.com/csharp/stringbuilder.html

        2
  •  42
  •   Alan    17 年前

    StringBuilder的默认容量为16个字符(我使用.NET Reflector查找)。

        3
  •  35
  •   Trisped    10 年前

    默认值为16,这似乎是.NET框架中任何类型数组或列表的默认容量。 StringBuilder上所需的重新分配数量越少越好。 同时,也不需要分配太多的资源。

    我通常用一些关于StringBuilder最终大小的粗略估计来实例化StringBuilder。 例如,这可以基于一些迭代计数,稍后您将使用这些计数来构建字符串,乘以此迭代中每个项所需的大小。

    // where 96 is a rough estimate of the size needed for each item
    StringBuilder sb = new StringBuilder ( count * 96 );
    for ( int i = 0; i < count; i++ )
    {
    ...
    }
    

    当StringBuilder的大小太小,无法写入下一个字符串时, StringBuilder的内部char数组重新分配到当前大小的两倍。

        4
  •  11
  •   Jon Hanna    12 年前

    今天这个问题是另一个问题的复制品,但我注意到有一部分没有回答。如人们所说,默认值(假设这意味着“当不使用足够大的字符串创建时”)是16,但在这里,当您应该更改它时,我看不到任何内容。

    当你可以这样做的时候,你可以改变它作为一个可能的优化。事实上,16的选择与优化相反。 优化 选择价值观和方法,以便特别适合特定案例或可能案例的子集(通常不是“使事情更快”,尽管我们经常使用这个词)。在这里,这个班的设计师必须处理 泛化 -选择价值和方法,以便在广泛的案例中提供合理的良好表现。

    它们越小,记忆的使用就越少。

    它们越大,处理更大字符串的重新分配就越少。

    在某些情况下,二进制圆(二次幂的整数)比其他数字更能提供更好的性能,这有几个原因,因此他们选择了其中一个,但除了4或16或1024之间的选择外,还需要平衡不同的可能值。

    某人 使用 StringBuilder 与其设计它,不如更好地了解它们可能需要的尺寸。

    如果他们打算 Append 5个1位数字以及总共43个字符的字符串,然后是 字符串拼接 不管怎样都将是48个字符,因此它们应该使用48的容量,因为48对于48长度的字符串来说,48总是最有效的大小。

    如果他们做的事情长度可能在23到34个字符之间,他们应该使用34个字符。

    如果他们所做的事情可能永远不会超过60个字符,但有时可能会有,他们应该使用64个字符(不要为大多数部分重新分配,并在少数情况下获得上述两个好处的力量)。

    如果在这个问题上不可能得出结论,或者至少很难得出结论,而不是性能热点,那么您应该使用缺省值。

        5
  •  1
  •   shA.t Rami Jamleh    11 年前

    我们可以利用 StringBuilder 班级:

    StringBuilder builder = new StringBuilder();
    var capacity = builder.Capacity;
    var maxCapacity = builder.MaxCapacity;
    

    这里容量定义默认容量 字符串拼接 .

    字符串拼接 Max Capacity 与的最大值相同 Int32 .

        6
  •  0
  •   Marc Gravell    17 年前

    [编辑:当时,问题是关于 StringList ]

    你是说 StringCollection ?这使用空的 ArrayList 最初,所以答案是0。你没有选择去改变它。当您第一次添加一个项目时,容量跳到4,然后在填充时使用加倍策略。

    如果你是说 List<string> ,则类似(空 T[] 不是一个 数组列表 ,但是如果需要的话,您可以初始化一个已知的大小(也就是说,您知道需要多少数据)。再一次,第一次你 Add 到A List<T> 大小跳到4,然后在每次填充时翻倍。

        7
  •  0
  •   Deep Jadia    8 年前

    字符串生成器的默认容量为 16字 , 字符串生成器的最大容量为 2147483647个字符 .

    所以不用担心存储长时间响应!!!!

        8
  •  -1
  •   dove    17 年前

    读关于 Stringbuilder capacity 也有示例应用程序可以证明这一点。

    推荐文章