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.

本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2013/01/09/csharp-6.html如需转载请自行联系原作者


张雪飞

 

相关文章
|
Web App开发 JavaScript 关系型数据库
|
7月前
|
机器学习/深度学习 人工智能 算法
《AI重塑无线网络:化解信号干扰与波动难题》
无线网络在数字化时代至关重要,但信号干扰与波动(如同频干扰、邻频干扰及物理环境变化等)严重影响性能。传统方法虽能缓解部分问题,但在复杂动态环境中效果有限。人工智能的引入,通过机器学习和强化学习,实现了智能信道选择、功率控制及干扰消除,显著提升网络稳定性与效率。实际应用中,智能工厂和大型商场的案例证明了AI技术的有效性。未来,随着AI不断发展并与其他技术融合,无线网络将更稳定高效,为用户带来更优体验。
326 5
|
SQL 关系型数据库 MySQL
|
缓存 文件存储 对象存储
OSS 入门基础篇-自动刷新
本文主要介绍 上传同名文件到 OSS 后如何自动刷新掉 CDN 缓存的旧文件内容
3667 0
OSS 入门基础篇-自动刷新
|
缓存 前端开发 调度
千万级用户直播APP——服务端结构设计和思考
在2016杭州云栖大会的“开发者技术峰会”上,来自一下科技的技术副总裁张华伟给大家解密了一直播千万级用户服务端架构设计和成长历程。
20982 0
|
应用服务中间件 nginx Docker
微服务实战之春云与刀客(四)—— docker swarm 集群实战
概述 docker swarm 是一个非常简单的docker 原生集群部署环境。在docker swarm 出来之前,要搭建一个docker 集群需要复杂的网络运维和配置能力,而docker swarm 把这一切都解放了。
3980 0
|
机器学习/深度学习 人工智能 自然语言处理
|
移动开发 Android开发
|
量子技术 机器学习/深度学习 索引
带你读《量子编程基础》之二:预备知识
本书讨论了如何扩展当前计算机的新程序设计方法和技术,以利用量子计算机的独特能力。相比于现有计算机系统,量子计算机在处理速度上具有显著优势。世界各地的政府和企业都投入了大量资金,希望建造实用的量子计算机。本书结合作者在量子计算领域多年的研究经验,并辅以大量的例子和插图,介绍了量子编程语言及其所需的重要工具和技术,对于学者、研究人员和开发人员来说都是非常宝贵的参考资料。
|
监控 Oracle 关系型数据库
Linux iotop工具简介
Linux iotop工具简介iotop的简介: iotop是一款开源、免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息。它是Python语言编写的,与iostat工具比较,iostat是系统级别的IO监控,而iotop是进程级别IO监控。
2100 0