zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    复制代码

    输出结果为:10 16

    这里可以说明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点滴
  • 相关阅读:
    互联网产品跨部门沟通的10个原则(转)
    Axure 全局辅助线(转)
    2015最新移动App设计尺寸视觉规范【图文版】(转)
    iOS和Android的app界面设计规范(转)
    安卓app设计规范整理和Android APP设计篇(转)
    19条ANDROID平台设计规范(转)
    Objective-C编码规范:26个方面解决iOS开发问题(转)
    AxureRP7.0各类交互效果汇总帖(转)
    Windows Server 2016与旧版本系统比较
    application Initialization设置导致处理程序ExtensionlessUrlHandler-Integrated-4.0在其模块列表中有一个错误模块问题的解决
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2853584.html
Copyright © 2011-2022 走看看