深入分析C#中的StringBuilder

embedded/2024/12/23 6:31:00/

C# 中的类是专为字符串操作而设计的命名空间的重要组成部分。与 C# 中的常规字符串不同,C# 中的常规字符串是不可变的,它提供了一个可变的字符串对象。这意味着可以修改它,而无需为每次修改创建新对象的开销,这在处理大型字符串或执行频繁的字符串操作时特别有用。StringBuilderSystem.TextStringBuilder

StringBuilder 的核心概念

1. 可变字符串操作

StringBuilder是可变的,这意味着它可以在创建后进行更改。相比之下,C# 中的常规字符串是不可变的。每次修改字符串时,都会创建一个新的字符串对象。在涉及频繁修改的方案中,这可能效率低下。 通过允许更改(例如追加、插入、删除或替换字符)来解决此问题,而无需每次都创建新实例。StringBuilder

2. 内存效率

实例化对象时,它会分配一个缓冲区以适应修改。此缓冲区具有默认容量,但当内容超过当前容量时,它可以自动扩展。与为每次修改创建新字符串相比,这种动态调整大小更节省内存。StringBuilder

3. 性能

在涉及大量字符串连接或修改的方案中,使用 或 的字符串连接性能明显优于字符串连接。这种性能提升是因为最大限度地减少了内存复制和分配开销。StringBuilder+String.ConcatStringBuilder

使用 StringBuilder 分析方案

方案 1:基本追加操作

public static void Main(string[] args)  
{  StringBuilder y = new StringBuilder();  y.Append("Dayanand");  AppendString(y);  Console.WriteLine(y);  
}  public static void AppendString(StringBuilder x)  
{  x.Append(" Thombare");  
}

在第一种情况下,我们看到了 的基本用法。使用字符串“Dayanand”创建并初始化对象。然后,将该方法作为参数调用。在里面,字符串“Thombare”被附加到。这演示了如何动态增长大小,以及在方法中对其所做的更改如何由于其引用类型行为而反映在原始对象中。StringBuilderStringBuilderyAppendStringyAppendStringyStringBuilder

分析:

  • y.Append("Dayanand"):使用“Dayanand”初始化。StringBuilder

  • AppendString(y):将实例传递给 ,后者将 “ Thombare” 追加到它。StringBuilderAppendString

  • Console.WriteLine(y):显示串联结果。

结果:

  • 输出:Dayanand Thombare

  • 将保留在方法中所做的更改。StringBuilderyAppendString

关键要点:该方法有效地将新字符串添加到现有内容的末尾。AppendStringBuilder

方案 2:将 StringBuilder 作为值传递

public static void Main(string[] args)  
{  StringBuilder y = new StringBuilder();  y.Append("Dayanand");  AppendString(y);  Console.WriteLine(y.ToString());  Console.WriteLine(y == null);  
}  public static void AppendString(StringBuilder x)  
{  x = null;  
}

在第二种方案中,尝试将参数设置为 null。但是,这不会影响 中使用的原始文件。null to 的赋值是 in 的本地值,不会更改 in 的引用。AppendStringStringBuilderxStringBuilderyMainxAppendStringyMain

分析:

  • 在 中,设置仅影响引用的本地副本。它不会影响 in 引用的原始对象。AppendStringx = nullStringBuilderyMain

  • 调用方法后,实例保持不变。StringBuildery

结果:

  • 输出:和DayanandFalse

  • 不受 中的 null 赋值的影响。StringBuilderyAppendString

关键要点:将 a 传递给方法会传递其引用。但是,更改方法内部的引用不会影响原始对象。StringBuilder

方案 3:将 ref 与 StringBuilder 配合使用

public static void Main(string[] args)  
{  StringBuilder y = new StringBuilder();  y.Append("Dayanand");  AppendString(ref y);  Console.WriteLine(y.ToString());  Console.WriteLine(y == null);  
}  public static void AppendString(ref StringBuilder x)  
{  x = null;  
}

在第三种方案中,使用关键字通过引用获取参数。当在 中设置为 null 时,它也会设置为 null。这是因为 和 是对同一对象的引用,而 using 意味着对引用本身的任何更改都反映在方法之外。AppendStringStringBuilderrefxAppendStringyMainxyStringBuilderref

分析:

  • 关键字表示方法接收对引用的引用。因此,更改 in 直接影响 .refxAppendStringyMain

  • 因此,设置设置为 null。x = nullAppendStringy

结果:

  • 输出:尝试执行时将抛出异常,为 null。y.ToString()y

  • 该方法将 in 设置为 null。StringBuilderyMainAppendString

关键要点:使用允许方法修改引用本身,而不仅仅是它指向的对象。ref

最佳实践和注意事项

  1. 频繁修改字符串时使用:当您预计对字符串进行多次修改时使用,尤其是在循环或密集连接方案中。StringBuilder

  2. 了解容量和性能:了解初始容量及其扩展。过度扩展可能会影响性能,因此有时指定初始容量是有益的。

  3. 螺纹安全:不是螺纹安全的。如果需要跨多个线程使用它,请确保正确同步。StringBuilder

  4. 转换为字符串:根据需要使用该方法将内容转换回常规字符串。ToStringStringBuilder

  5. 追加和操作:利用 、 、 和 等方法进行高效的字符串操作。AppendRemoveInsertReplace

了解 C# 中的类对于在应用程序中高效地操作字符串至关重要。它的可变性,加上高效的内存管理,使其成为需要频繁或复杂字符串操作的场景不可或缺的工具。通过在常规字符串和 之间仔细选择,并了解将实例传递给方法的含义,可以编写更高效、更可维护的 C# 代码。

如果你喜欢我的文章,请给我一个赞!谢谢


http://www.ppmy.cn/embedded/50137.html

相关文章

UniVue更新日志:使用ObservableList优化LoopList/LoopGrid组件的使用

github仓库 稳定版本仓库:https://github.com/Avalon712/UniVue 开发版本仓库:https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库:https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 如果大家…

QT串口调试助手V2.0(源码全开源)--上位机+多通道波形显示+数据保存(优化波形显示控件)

首先关于Qt的安装和基本配置这里就不做重复说明了,注:本文在Qt5.14基础上完成 完整的项目开源仓库链接在文章末尾 图形控件——qcustomplot QCustomPlot是一个基于Qt框架的开源绘图库,用于创建高质量的二维图表和数据可视化。 QCustomPlot…

ubuntu访问windows共享文件夹

方法: Ubuntu访问Windows共享文件夹的方法-CSDN博客 基于交换机的PC端网络通信_服务器交换机pc端-CSDN博客 补充说明: 在这里面输入: smb://192.168.0.30/WindowsShareToLinux

Java学习 - Docker管理和容器命令 实例

docker管理 查看docker版本,检测是否可用 sudo docker version查看docker 系统信息 sudo docker infodocker容器命令 容器状态 容器标识 容器长uuid容器短uuid容器名字 查看容器状态 sudo docker status [容器标识1] [容器标识2] [容器标识n]深入查看容器信息 su…

Python序列切片中的双冒号[::]

Python提供了可迭代序列的切片操作: a[start: end: step]:即a[开始索引: 结束索引: 步长],左闭右开,当步长取默认值时,第二个冒号可省略 以下是一些常用的使用示例: a [2, 3, 4, 5, 6]# 取序列全部元素…

如何使用任意浏览器远程访问本地搭建的Jellyfin影音平台

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

分数之限下的抉择:深入解析好专业与好学校的选择

随着2024年高考的落幕,无数考生和家长正站在人生的十字路口,面临着分数限制下选择好专业还是好学校的难题。这个选择不仅关系到考生未来的职业道路,更影响着他们的人生轨迹。本文将深入解析这一选择背后的考量因素,为考生和家长提…

不想搭集群,直接用spark

为了完成布置的作业,需要用到spark的本地模式,根本用不到集群,就不想搭建虚拟机,hadoop集群啥的,很繁琐,最后写作业还用不到集群(感觉搭建集群对于我完成作业来说没有什么意义)&…