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;// 正确的做法,使用 StringBuilderStringBuilder 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)
————————————————

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode算法题之递归--二叉树中的深搜总结

递归的本质是找重复的子问题 文章目录 1.计算布尔二叉树的值2.从根节点到叶节点数字之和3.二叉树剪枝4.验证二叉搜索树5.二叉搜索树中第K小的元素6.二叉树的所有路径 1.计算布尔二叉树的值 计算布尔二叉树的值 class Solution { public:bool evaluateTree(TreeNode* root) …

Spring Cloud + Vue前后端分离-第9章 大文件断点续与极速秒传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 ​​​​​​Spring Cloud Vue前后端分离-第9章 大文件断点续与极速秒传 作为一个视频网站&#xff0c;一个文件小则几十M&#xff0c;大则上G&#xff0c;上传一个大文件受网络影响很大&#xff0c;文…

【网络技术】【Kali Linux】Wireshark嗅探(四)域名系统(DNS)

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解域名系统&#xff08;DNS&#xff09;的工作原理。 二、域名系统概述 简单来说&#xff0c;域名系统&#xff08;Domain Name System, DNS&#xff09;将域名&#xff08;可以理解为“网址”…

Prometheus-AlertManager 邮件告警

环境,软件准备 本次演示环境&#xff0c;我是在虚拟机上安装 Linux 系统来执行操作&#xff0c;以下是安装的软件及版本&#xff1a; System: CentOS Linux release 7.6Docker: 24.0.5Prometheus: v2.37.6Consul: 1.6.1 docker 安装prometheus,alertmanage,说明一下这里直接将…

智慧农田使用的自动虫情测报灯的作用

TH-CQ3S随着科技的不断进步&#xff0c;智慧农业正在全球范围内兴起。作为智慧农业的重要组成部分&#xff0c;智慧农田已经成为提高农业生产效率、保障农产品质量安全的重要手段。而在智慧农田中&#xff0c;自动虫情测报灯的作用不可忽视。 自动虫情测报灯&#xff0c;顾名思…

代码随想录第三十九天——不同路径,不同路径||

leetcode 62. 不同路径 题目链接&#xff1a;不同路径 确定dp数组以及下标的含义 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径确定递推公式 求dp[i][j]&#xff0c;只能有两个方向推导出来&#xf…

C++大作业——学生选课系统优化版

C大作业——学生选课系统优化版 前言1.学生类和课程类的实现2.输入输出流重载的实现3.增删改查的实现4.多级菜单的实现5.选课和退选的实现5.完整代码 前言 本文是对本人之前写过的一个学生选课系统的优化&#xff0c;整体上的逻辑是和我上一篇博客一样的&#xff08;链接在此&a…

​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 圣诞活动预…

Linux学习(9)——RAID与服务器的常见故障

目录 一、服务器常见故障 1、系统不停重启进入不了系统 2、卡在开机界面右下角有fA B2 H8 3、系统安装不上 4、如何进入服务器的bios 5、一般进入阵列卡的快捷键 6.网络不通 7.硬盘不识别 二、RAID相关知识 1、RAID的概念 2、RAID功能实现 3、RAID实现的方式 三、常…

【算法系列 | 11】深入解析查找算法之—插值查找

序言 心若有阳光&#xff0c;你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏&#xff0c;希望能帮助大家很好的了解算法。主要深入解析每个算法&#xff0c;从概念到示例。 我们一起努力&#xff0c;成为更好的自己&#xff01; 今天第11讲&#xff0c;讲…

RK3568 学习笔记 : 开机上电与串口波特率

前言 开发板&#xff1a;【正点原子】ATK-DLRK3568 开发板&#xff0c;包装什么的看上去有点高大上&#xff0c;也有点贵。。 开发板资料的 Linux-SDK 编译通过了&#xff0c;想尝试第一次上电开机&#xff0c;不过&#xff0c;开始出了一点状况&#xff0c;串口信息是乱码&am…

Python贪吃蛇小游戏(PyGame)

文章目录 写在前面PyGame入门贪吃蛇注意事项写在后面 写在前面 本期内容&#xff1a;基于pygame的贪吃蛇小游戏 实验环境 python3.11及以上pycharmpygame 安装pygame的命令&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygamePyGame入门 pygam…

国家信息安全水平等级考试NISP二级题目卷③(包含答案)

国家信息安全水平等级考试NISP二级题目卷&#xff08;三&#xff09; 国家信息安全水平等级考试NISP二级题目卷&#xff08;三&#xff09;需要报考咨询可以私信博主&#xff01; 前言&#xff1a; 国家信息安全水平考试(NISP)二级&#xff0c;被称为校园版”CISP”,由中国信息…

力扣_day2

两数相加 用python3更方便&#xff0c;有内置的ListNode。 # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next nextclass Solution(object):def cycles(self,head):now headindex 0while(now):index 1now now.…

网络通信(2)-IP地址详解

目录 一、协议IP定义 二、IP地址分类 三、私有地址 四、IP地址的类型 4.1 IPv4

<HarmonyOS第一课>从简单的页面开始

【习题】构建漂亮的页面 目录 判断题 单选题 多选题 判断题 1.在Column容器中的子组件默认是按照从上到下的垂直方向布局的&#xff0c;其主轴的方向是垂直方向&#xff0c;在Row容器中的组件默认是按照从左到右的水平方向布局的&#xff0c;其主轴的方向是水平方向。正确…

算法导论复习——CHP25 多源最短路

问题描述 给定一个带权重的有向图G(V,E)&#xff0c;其权重函数为ω:E→R。 在图中&#xff0c;对所有的结点对 u,v∈V&#xff0c;找出从结点u到结点v的最短路径。 该问题的解以表格&#xff08;二维数组&#xff09;的形式给出&#xff1a;第u行第v列给出从结点u到结…

【ABAQUS复合材料建模】专题

Abaqus复材&#xff0c;线上直播&#xff0c;提供案例&#xff0c;回放视频&#xff0c;群答疑 【ABAQUS复合材料建模】 网格划分、分层合结构、静力失效、热-力耦合、分层/界面损伤、XFEM裂纹扩展、加筋板屈曲、剪切失效、颗粒/短纤维、增韧复材、胞元、自由振动、高\低速冲…

在Linux中以后台静默运行Java应用程序

在Linux系统上运行Java应用程序时&#xff0c;有时我们希望将其设置为后台运行&#xff0c;而关闭终端窗口时不会影响进程的执行。在本文中&#xff0c;我们将介绍几种实现这一目标的方法。 1. 使用nohup命令 nohup是一个用于在后台运行进程的命令&#xff0c;而且关闭终端窗…

C语言实例_math.h库函数功能及其用法详解

一、前言 数学在计算机编程中扮演着至关重要的角色&#xff0c;C语言的math.h头文件提供了一系列的函数和工具&#xff0c;用于数学计算和常用数学函数的实现。这些函数包括数值运算、三角函数、指数对数函数等&#xff0c;为开发人员提供了强大的数学处理能力。本文将对math.…