好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

StringBuilder的Length和Capacity属性实践

StringBuilder的Length和Capacity属性实践

几天前的一次笔试中遇到了关于StringBuilder的Length和Capacity属性的问题,之前忽略了。今天实践下:

1.普通实践

官方解释如下:

StringBuilder.Capacity: 获取或设置可包含在当前实例所分配的内存中的最大字符数。

StringBuilder.Length:获取或设置当前 StringBuilder 对象的长度。

     class   Program
    {
          static   void  Main( string  [] args)
        {
            StringBuilder sb  =  new  StringBuilder( "  0123456789  "  );//长度为10
            Console.WriteLine(  "  sb.Length:  "  + sb.Length +  "   sb.Capacity:  "  +  sb.Capacity);  
            Console.ReadKey();
        }
    } 

这里可以说明StringBuilder的Capacity最小分配的长度是16.当初始化一个长度为17的字符串时,如StringBuilder sb = new StringBuilder("01234567891234567"),

显示的是17。

2.文艺实践

在代码里面更改Length的值,这时在看看它们的值各是多少。代码如下:

     class   Program
    {
          static   void  Main( string  [] args)
        {
            StringBuilder sb  =  new  StringBuilder( "  0123456789  " ); //  10 
             sb.Length =  6    ; 
            sb.Append(  "  012345678  " ); //  9 
            Console.WriteLine( "  sb.Length:  "  + sb.Length +  "   sb.Capacity:  "  + sb.Capacity+ "    " + sb.ToString());
            Console.ReadKey();
        }
    } 

输出结果为:

可以知道:当我们显示的更改了Length的值以后,字符串前面的部分保留,后面的丢弃了。最终的Length值为15,这时仍然小于16,所以Capacity为16。更下代码:

 sb.Append("012345678910");在前面的基础上增加这里的长度到12位。这时输出结果为:Length为18,Capacity为32。说明Capacity是以16的倍数增长。

如果显示的更改Capacity的值会怎么样?

     class   Program
    {
          static   void  Main( string  [] args)
        {
            StringBuilder sb  =  new  StringBuilder( "  0123456789  " ); //  10 
            sb.Length =  6  ;
             sb.Capacity   = 15    ; 
            sb.Append(  "  012345678910  " ); //  长度12 
            Console.WriteLine( "  sb.Length:  "  + sb.Length +  "   sb.Capacity:  "  + sb.Capacity+ "    " + sb.ToString());
            Console.ReadKey();
        }
    } 

这时输出18,30.因为18超出了这里已经指定的Capacity的值15,成倍增长到30. 所以Capacity增长的基数默认是16,如果有显示指定,则为指定的值。

接着修改下代码,sb.Capacity=8。这样Capacity的2被都比Length小,这时输出的结果为:18,18. 这里并不是在Capacity的初值8的基础上成倍增加。

3.2B实践

 其实从上面的实践可以看出,Capacity的大小分配是在满足Length的情况下,尽量少占用空间。跟Length和显示指定的Capacity大小有关系。

     class   Program
    {
          static   void  Main( string  [] args)
        {
            StringBuilder sb  =  new  StringBuilder( "  0123456789  " ); //  10 
            sb.Length =  6  ;
             sb.Capacity   = 5    ; 
            sb.Append(  "  012345678910  " ); //  长度12 
            Console.WriteLine( "  sb.Length:  "  + sb.Length +  "   sb.Capacity:  "  + sb.Capacity+ "    " + sb.ToString());
            Console.ReadKey();
        }
    } 

当Capacity小于Length时,会抛出异常System.ArgumentOutOfRangeException.

作者: Gabriel Zhang
出处: http://www.cnblogs.com/mszhangxuefei/
本文版权归作者和博客园共有,欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

我只有一件事,就是忘记背后,努力面前的,向着标竿直跑

 

分类:  C#.NET点滴

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于StringBuilder的Length和Capacity属性实践的详细内容...

  阅读:32次

上一篇: TCP堵塞控制

下一篇:图片轮播