StringBuilder的Length和Capacity属性实践

简介: 几天前的一次笔试中遇到了关于StringBuilder的Length和Capacity属性的问题,之前忽略了。今天实践下: 1.普通实践 官方解释如下: StringBuilder.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.

 

相关文章
|
关系型数据库 MySQL 数据库
一文剖析MySQL主从复制异常错误代码13114
一文剖析MySQL主从复制异常错误代码13114
1668 0
|
存储 网络协议 定位技术
高德地图开放平台IP地位接口使用说明
高德地图开放平台IP地位接口使用说明
2669 0
|
4月前
|
开发框架 监控 前端开发
Playwright进阶篇 (5) | 网络请求拦截与Mock
Playwright 提供强大的网络请求拦截与 Mock 能力,支持修改请求参数、模拟 API 响应、构造异常场景、加速测试执行,提升测试效率与可靠性。
|
机器学习/深度学习 数据采集 人工智能
《大模型训练成本高,如何在不牺牲性能的前提下破局》
在人工智能领域,大模型训练成本高昂,主要源于硬件设备、数据处理和算法优化的需求。降低训练成本的关键在于合理配置硬件资源、改进数据处理方法、优化算法和模型结构,以及采用分布式训练技术。通过这些措施,企业可以在不影响模型性能的前提下,显著减少计算资源、人力和时间的投入,实现更高效的模型训练。实践证明,综合运用这些方法能够有效降低成本,推动人工智能技术的可持续发展。
845 18
|
Web App开发 测试技术
如何让下载的chrome与chromedriver匹配
如何让下载的chrome与chromedriver匹配
1073 0
|
C语言 存储 编译器
【C语言基础教程】函数指针与指针大小
【C语言基础教程】函数指针与指针大小
438 0
【C语言基础教程】函数指针与指针大小
|
编解码
MATLAB | 科研绘图第十五期多Y轴图
MATLAB | 科研绘图第十五期多Y轴图
306 0
|
消息中间件 安全 关系型数据库
kswapd0进程对于CPU占有率高的情况下排查到黑客植入脚本,与黑客斗智斗勇的三个回合(一)
kswapd0进程对于CPU占有率高的情况下排查到黑客植入脚本,与黑客斗智斗勇的三个回合
1109 1
|
算法 数据库 计算机视觉
舌象图片自适应调节——gamma校正算法(五)
舌象图片自适应调节——gamma校正算法(五)
552 0
|
SQL 数据挖掘 Python
史上最全的Python操作 “PPT” 文档大全,以后写“数据分析报告”靠她了!
史上最全的Python操作 “PPT” 文档大全,以后写“数据分析报告”靠她了!
1332 0
史上最全的Python操作 “PPT” 文档大全,以后写“数据分析报告”靠她了!