当前位置: 首页 > news >正文

C#常考随笔2:函数中多次使用string的+=处理,为什么会产生大量内存垃圾(垃圾碎片),有什么好的方法可以解决?

在 C# 中,由于string类型是不可变的,当在函数中多次使用+=操作符来拼接字符串时,每次操作都会创建一个新的string对象,旧的对象则成为垃圾对象,这会导致大量的内存分配和垃圾回收,产生内存垃圾和碎片。

在需要多次拼接字符串的场景中,优先使用StringBuilder类,并根据情况预分配容量,或者使用string.Join方法,减少内存垃圾的产生。

1. 使用StringBuilder

StringBuilder类是一个可变的字符串类型,它内部维护了一个字符数组,当需要追加字符串时,会在这个数组上进行操作,而不是像string那样每次都创建新的对象。因此,使用StringBuilder可以显著减少内存分配和垃圾回收的开销。

示例代码

using System;
using System.Text;class Program
{static void Main(){StringBuilder sb = new StringBuilder();for (int i = 0; i < 1000; i++){sb.Append(i.ToString());}string result = sb.ToString();Console.WriteLine(result);}
}

2. 预分配StringBuilder的容量

在创建StringBuilder对象时,可以预先指定其容量,这样可以避免在追加字符串时频繁地进行数组扩容操作,进一步提高性能。

示例代码

using System;
using System.Text;class Program
{static void Main(){// 假设最终字符串长度大约为 5000StringBuilder sb = new StringBuilder(5000); for (int i = 0; i < 1000; i++){sb.Append(i.ToString());}string result = sb.ToString();Console.WriteLine(result);}
}

3. 使用string.Join方法

如果需要将一个字符串数组或集合中的元素拼接成一个字符串,可以使用string.Join方法。string.Join方法会根据元素的数量和长度预先计算所需的内存空间,然后一次性分配,避免了多次创建string对象。

示例代码

using System;
using System.Collections.Generic;class Program
{static void Main(){List<string> stringList = new List<string>();for (int i = 0; i < 1000; i++){stringList.Add(i.ToString());}string result = string.Join("", stringList);Console.WriteLine(result);}
}
http://www.lryc.cn/news/527204.html

相关文章:

  • leetcode刷题记录(一百)——121. 买卖股票的最佳时机
  • MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍
  • CIMRTS材质美化--放大采样、缩小采样
  • P8738 [蓝桥杯 2020 国 C] 天干地支
  • PyCharm接入DeepSeek实现AI编程
  • Java编程语言:辉煌的历史与未来前景
  • 麦田物语学习笔记:保存和加载场景中的物品
  • 页高速缓存与缓冲区缓存的应用差异
  • 深度学习 Pytorch 单层神经网络
  • 一文读懂 HTTP:Web 数据交换的基石
  • 算法知识补充2
  • Vue.js组件开发-实现对视频预览
  • SSM开发(三) spring与mybatis整合(含完整运行demo源码)
  • .NET MAUI进行UDP通信(二)
  • 14-6-3C++STL的list
  • AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs
  • WPA_cli P2P命令详解及使用
  • 【竞技宝】LPL:IG3-1击败RNG
  • sqlite3 学习笔记
  • Visual Studio Community 2022(VS2022)安装方法
  • 项目集成RabbitMQ
  • 3097. 或值至少为 K 的最短子数组 II
  • Linux 35.6 + JetPack v5.1.4之编译器升级
  • [MoeCTF 2022]ezhtml
  • 活动回顾和预告|微软开发者社区 Code Without Barriers 上海站首场活动成功举办!
  • 使用 Redis List 和 Pub/Sub 实现简单的消息队列
  • 本地项目上传到码云
  • Ansible入门学习之基础元素介绍
  • 大数据治理实战指南:数据质量、合规与治理架构
  • leetcode_链表 234.回文链表