C# StringBuilder对比string的优点和15大案例

文章目录

    • StringBuilder和String 对比
    • 1. **循环内字符串连接**
    • 2. **构建大型日志消息**
    • 3. **格式化长字符串**
    • 4. **SQL 查询构造**
    • 5. **从文件读取并合并行**
    • 6. **拼接数组元素**
    • 7. **格式化电子邮件模板**
    • 8. **处理用户输入流**
    • 9. **JSON 或 XML 格式的序列化与构建**
    • 10. **动态生成 HTML 页面**
    • 11. **构建长路径名**
    • 12. **处理大量字符串分割与合并**
    • 13. **格式化复杂的表格数据**
    • 14. **动态生成SQL IN子句**
    • 15. **拼接加密后的密码散列**

C# 中的 stringStringBuilder 类主要在内存管理和字符串操作性能上存在显著区别:

StringBuilder和String 对比

String 类:

  1. 不可变性:字符串是不可变的,每次对字符串进行修改(如拼接、替换等)时,都会创建一个新的字符串实例。
  2. 内存分配:由于不可变性,每次字符串操作都需要在内存堆中为新字符串分配空间,这会导致频繁的内存分配和垃圾回收。
  3. 性能:对于单个或少量的字符串操作,性能影响可能不大。但在大量或频繁的字符串连接操作(尤其是循环中),会产生大量的中间字符串,严重影响性能。

StringBuilder 类:

  1. 可变性:StringBuilder 是可变的,可以在原对象上直接修改内容,不会生成新的对象。
  2. 内存效率:它预先分配了一定大小的缓冲区,并且可以根据需要动态扩展容量,减少了内存分配次数,从而提高了内存使用效率。
  3. 性能:适用于处理多个字符串拼接的情况,尤其是在循环或其他需要多次修改字符串的场景下,其性能远优于 String 类。

提升性能的使用案例

以下是十个展示 StringBuilder 在性能优化方面应用的示例:

1. 循环内字符串连接

string result = "";
for (int i = 0; i < 10000; i++)
{
    // 错误的做法,会生成很多临时字符串
    // result += "Item" + i;

    // 正确的做法,使用 StringBuilder
    StringBuilder sb = new StringBuilder();
    sb.Append("Item");
    sb.Append(i);
    result = sb.ToString(); // 只在循环结束后生成最终字符串
}

2. 构建大型日志消息

StringBuilder logBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
    logBuilder.Append(data[i].ToString());
    logBuilder.Append(",");
}
string logMessage = logBuilder.ToString().TrimEnd(',');

3. 格式化长字符串

StringBuilder reportBuilder = new StringBuilder();
foreach (var item in reportData)
{
    reportBuilder.AppendFormat("ID: {0}, Name: {1}, Value: {2}\n", item.Id, item.Name, item.Value);
}
string report = reportBuilder.ToString();

4. SQL 查询构造

StringBuilder sqlQuery = new StringBuilder("SELECT * FROM Users WHERE ");
bool isFirst = true;
foreach (var condition in conditions)
{
    if (!isFirst)
        sqlQuery.Append(" AND ");
    sqlQuery.Append($"Column = '{condition}'");
    isFirst = false;
}
ExecuteSql(sqlQuery.ToString());

5. 从文件读取并合并行

StringBuilder fileContent = new StringBuilder();
using (StreamReader reader = new StreamReader("largeFile.txt"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        fileContent.AppendLine(line);
    }
}
string completeFileText = fileContent.ToString();

6. 拼接数组元素

int[] numbers = Enumerable.Range(1, 10000).ToArray();
StringBuilder numStr = new StringBuilder();
foreach (int number in numbers)
{
    numStr.Append(number.ToString());
    numStr.Append(",");
}
string numList = numStr.ToString().TrimEnd(',');

7. 格式化电子邮件模板

StringBuilder emailBody = new StringBuilder(emailTemplate);
emailBody.Replace("{Name}", customer.Name);
emailBody.Replace("{OrderNo}", order.OrderNumber);
SendEmail(customer.Email, emailBody.ToString());

8. 处理用户输入流

StringBuilder inputBuffer = new StringBuilder();
while (streamReader.Peek() >= 0)
{
    inputBuffer.Append((char)streamReader.Read());
}
ProcessInput(inputBuffer.ToString());

9. JSON 或 XML 格式的序列化与构建

StringBuilder jsonBuilder = new StringBuilder("[");
for (int i = 0; i < list.Count; i++)
{
    jsonBuilder.Append(JsonConvert.SerializeObject(list[i]));
    if (i < list.Count - 1)
        jsonBuilder.Append(",");
}
jsonBuilder.Append("]");
string jsonArray = jsonBuilder.ToString();

10. 动态生成 HTML 页面

```csharp
StringBuilder htmlPage = new StringBuilder("<html><body>");
foreach (var article in articles)
{
    htmlPage.AppendFormat("<h2>{0}</h2><p>{1}</p>", article.Title, article.Content);
}
htmlPage.Append("</body></html>");
return htmlPage.ToString();
```

11. 构建长路径名

StringBuilder pathBuilder = new StringBuilder();
pathBuilder.Append(basePath);
foreach (string directory in directories)
{
    pathBuilder.Append(Path.DirectorySeparatorChar);
    pathBuilder.Append(directory);
}
string fullPath = pathBuilder.ToString();

12. 处理大量字符串分割与合并

```csharp
string[] parts = longString.Split(';');
StringBuilder rebuiltString = new StringBuilder();
for (int i = 0; i < parts.Length; i++)
{
    rebuiltString.Append(parts[i].Trim());
    if (i < parts.Length - 1)
        rebuiltString.Append("; ");
}
string processedString = rebuiltString.ToString();
```

13. 格式化复杂的表格数据

```csharp
StringBuilder tableBuilder = new StringBuilder();
foreach (var row in dataTable.Rows)
{
    for (int i = 0; i < dataTable.Columns.Count; i++)
    {
        tableBuilder.Append(row[i].ToString().PadRight(20));
        if (i < dataTable.Columns.Count - 1)
            tableBuilder.Append("|");
    }
    tableBuilder.AppendLine();
}
string formattedTable = tableBuilder.ToString();
```

14. 动态生成SQL IN子句

```csharp
List<int> ids = GetIds();
StringBuilder inClause = new StringBuilder("IN (");
for (int i = 0; i < ids.Count; i++)
{
    inClause.Append(ids[i]);
    if (i < ids.Count - 1)
        inClause.Append(",");
}
inClause.Append(")");
ExecuteSql($"SELECT * FROM Users WHERE Id {inClause.ToString()}"); 
```

15. 拼接加密后的密码散列

```csharp
StringBuilder passwordHashBuilder = new StringBuilder();
using (SHA256 sha256 = SHA256.Create())
{
    byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(password));
    foreach (byte b in hashBytes)
    {
        passwordHashBuilder.Append(b.ToString("x2"));
    }
}
string passwordHash = passwordHashBuilder.ToString();
```

以上这些例子再次强调了在需要频繁修改和拼接字符串的场景下,StringBuilder相比于string能够显著提升性能。

python学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

静态网页设计——天行九歌(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1de411m7y4/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…

光明源@智慧环卫新标杆,智慧公厕系统全面升级

在城市的喧嚣之中&#xff0c;一个看似不太引人注目但却无法忽视的领域正在经历一场革命性的变革。作为城市基础设施的一部分&#xff0c;公厕一直以来被人们忽略&#xff0c;然而&#xff0c;随着科技的迅速发展&#xff0c;一项前所未有的升级正向我们走来——智慧公厕系统。…

2024.1.7周报

目录 摘要 ABSTRACT 一、文献阅读 1、题目 2、摘要 3、模型架构 4、文献解读 一、Introduction 二、创新点 三、实验过程 四、结论 二、深度学习知识 一、从Encoder-Decoder框架中理解为什么要有Attention机制 二、Attention思想 三、Seq2Seq Attention代码逐…

【C++】- 类和对象(!!C++类基本概念!this指针详解)

类和对象 引入类类的定义类的访问限定操作符类的作用域类的实例化类对象模型this指针 引入类 在 C中&#xff0c;引入了一个新的定义----------类。类是一种用户自定义的数据类型&#xff0c;用于封装数据和行为。类可以看作是一个模板或蓝图&#xff0c;描述了一组相关的数据和…

CCC数字钥匙设计【NFC】--NFC通信之APDU TLV

CCC3.0&#xff0c;包含NFC、BLE、UWB技术。当采用NFC通信时&#xff0c;车端与手机端是通过APDU来进行交互的。而在APDU中的data数据段&#xff0c;又可能会嵌入TLV协议的数据&#xff0c;以完成车端与手机端的通信交互。 本文先介绍APDU及TLV的一些基础知识&#xff0c;再通…

书生·浦语大模型第二课作业

作业一&#xff1a;小故事创作 作业要求&#xff1a;使用 InternLM-Chat-7B 模型生成 300 字的小故事&#xff08;需截图&#xff09; 完成情况&#xff1a; 作业二&#xff1a;熟悉 hugging face 下载功能 作业要求&#xff1a;熟悉 hugging face 下载功能&#xff0c;使用…

Anaconda 环境中安装OpenCV (cv2)

1、使用Anaconda 的对应环境&#xff0c;查看环境中的Python版本号 (1)使用Anaconda 查看存在的环境&#xff1a;conda info --env (2)激活环境&#xff1a;conda activate XXX 2、根据版本号&#xff0c;下载对应的 python-opencv 包 &#xff08;1&#xff09;选择国内源的…

[MySQL]视图索引以及连接查询案列

目录 1.视图 1.1视图是什么 1.2视图的作用 1.3操作 1.3.1创建视图 1.3.2视图的修改 1.3.3删除视图 1.3.4查看视图 2.索引 2.1什么是索引 2.2为什么要使用索引 2.3索引的优缺点 2.3.1优点 2.3.2缺点 2.4索引的分类 3.连接查询案列 4.思维导图 1.视图 1.1视图是什么 视图…

el-table魔改样式出现BUG,表格内容区域出现滚动条

问题&#xff1a;el-table表格内容区域在高度自适应的情况下冒出滚动条 解决办法&#xff1a; 代码排查后发现时我设置了fixed:“xxx” 属性就会导致滚动条出现的问题&#xff0c;不设置则无。 [{ type: index, label: 序号, fixed: left },{ prop: enterprisesName, label: …

【C++】带你学会使用C++线程库thread、原子库atomic、互斥量库mutex、条件变量库condition_variable

C线程相关知识讲解 前言正式开始C官方为啥要提供线程库thread构造函数代码演示this_threadget_id()yield()sleep_until和sleep_for mutex构造函数lock和unlock上锁全局锁局部锁lambda表达式 try_lock 其他锁时间锁递归版本专用锁recursive_mutex 锁的异常处理lock_guardunique_…

springboot整合缓存技术

缓存&#xff08;cache&#xff09; 为啥需要使用缓存 问题描述&#xff1a;企业级应用主要作用是信息处理&#xff0c;当需要读取数据时&#xff0c;由于受限于数据库的访问效率&#xff0c;导致整体系统性能偏低。&#xff08;就是说&#xff1a;应用程序直接与数据库打交道…

深入C++继承:面向对象编程的核心概念

C是一种功能强大的编程语言&#xff0c;支持面向对象编程&#xff08;OOP&#xff09;范式。在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它使得我们能够创建具有层次结构的类&#xff0c;并实现代码的重用和扩展。本文将深入探讨C中的继承机制&#xff0c;介…

[C#]C# OpenVINO部署yolov8-pose姿态估计模型

【源码地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法&#xff0c;用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块&#xff0c;通过联合检测和姿势…

屏幕截图--Snagit

Snagit是一款优秀的屏幕、文本和视频捕获、编辑与转换软件。它不仅可以捕获静止的图像&#xff0c;还能获得动态的图像和声音。软件界面干净清爽&#xff0c;功能板块一目了然&#xff0c;为用户提供专业的屏幕录制方案。可以根据自己的需求调整录制视频的分辨率、帧数、输出格…

Linux学习记录——삼십유 传输层TCP协议(1)

文章目录 1、TCP协议报文1、报头和有效载荷的分离2、TCP可靠性3、序号和确认序号4、16位窗口大小5、6个标志位和紧急指针 2、TCP可靠性1、应答机制2、超时重传机制3、连接管理机制握手挥手 3、流量控制 1、TCP协议报文 UDP属于TCP/IP协议族。 1、报头和有效载荷的分离 从头…

邮件群发怎么做才有效果?如何做邮件群发?

邮件群发的注意事项有哪些&#xff1f;QQ邮箱群发邮件的方法&#xff1f; 在当今的数字营销时代&#xff0c;邮件群发已成为企业与客户保持联系的重要手段。但如何确保邮件群发的效果最大化呢&#xff1f;下面&#xff0c;蜂邮EDM将探讨几个关键要素&#xff0c;帮助您更有效地…

HackTheBox - Medium - Linux - Ambassador

Ambassador Ambassador 是一台中等难度的 Linux 机器&#xff0c;用于解决硬编码的明文凭据留在旧版本代码中的问题。首先&#xff0c;“Grafana”CVE &#xff08;“CVE-2021-43798”&#xff09; 用于读取目标上的任意文件。在研究了服务的常见配置方式后&#xff0c;将在其…

阿里云服务器在哪个城市?云服务器地域节点分布表

2024年阿里云服务器地域分布表&#xff0c;地域指数据中心所在的地理区域&#xff0c;通常按照数据中心所在的城市划分&#xff0c;例如华北2&#xff08;北京&#xff09;地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…

C++20新特性解析:深入探讨协程库的实现原理与应用

C20新特性解析&#xff1a;深入探讨协程库的实现原理与应用 一、C20的协程库简介二、C20协程基础知识2.1、协程的基本概念和使用方法2.2、C20中的协程支持2.3、协程与传统线程的对比 三、C20协程库的实现原理四、C20协程库的应用实例总结 一、C20的协程库简介 C20引入了对协程…

2024年 复习 HTML5+CSS3+移动web 笔记 之HTML5遍

2023年黑 马学习视频 ---作复习&#xff01;&#xff01;&#xff01; 前言 和 路向 第一天 基础标签 1.开发环境安装 2.标签语法 3.Html 基本骨架 4.标签的关系 5.注释 6.标题标签 7.段落标签 8.换行与水平线标签 9.文本格式化标签 10.图像标签 11.路径&#xff08;绝对和相…