深入解析:C#学习26天:内存优化的几种方法

news/2025/10/5 12:33:18/文章来源:https://www.cnblogs.com/lxjshuju/p/19126470

1.减少对象创建


使用场景:

说明:

  • 重用对象可以降低内存分配和垃圾回收的开销。
  • 使用对象池(Object Pooling)技术来管理可重用对象的生命周期

 示例:

// 不优化的情况:每次都创建新的 StringBuilder
for (int i = 0; i < 1000; i++)
{
var builder = new StringBuilder();
builder.Append("Number: ");
builder.Append(i);
Console.WriteLine(builder.ToString());
}// 优化后的情况:重用同一个 StringBuilder
var sharedBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
sharedBuilder.Clear();
sharedBuilder.Append("Number: ");
sharedBuilder.Append(i);
Console.WriteLine(sharedBuilder.ToString());
}

2.使用合适的数据结构


使用场景:

说明:

  • 选择合适的数据结构可以提高程序的性能和内存利用率。
  • 在使用大型数据集合时,数据结构的选择尤为关键。

示例: 

// 使用 List
List<int> numbersList = new List<int> { 1,
2,
3,
4,
5 };// 使用 Array
int[] numbersArray = new int[] { 1,
2,
3,
4,
5 };// 当数据量固定时,Array 比 List 更节省内存Dictionary<int,
string> employeeDirectory = new Dictionary<int,
string>();employeeDirectory[1002] = "Robert";//快速查找更新,字典更快捷

3.使用 struct 代替 class(在合适的场景)


使用场景:

说明:

  • struct 提供值语义,存储在栈上,减少了堆内存的使用。
  • 需要注意避免 struct 过大,因为大结构体会增加复制的成本。

示例:

// 使用 class
class PointClass
{
public int X { get; set; }
public int Y { get; set; }
}
// 使用 struct
struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
}// struct 通常会节省内存,尤其是在大量小对象的情况下
// 使用 class
void ProcessPointsClass()
{
for (int i = 0; i < 1000000; i++)
{
PointClass p1 = new PointClass(i, i);
}
}
// 使用 struct
void ProcessPointsStruct()
{
for (int i = 0; i < 1000000; i++)
{
PointStruct p1 = new PointStruct(i, i);
}
}

4.避免装箱和拆箱


使用场景:

说明:

  • 使用泛型集合(如 List<int> 而非 ArrayList)可以避免装箱。
  • 频繁装箱和拆箱不仅浪费内存,还会影响性能。

示例:

using System;
using System.Collections;
class Program
{
static void Main()
{
ArrayList list = new ArrayList();// 装箱:整数被包装成对象
list.Add(42);// 拆箱:对象被转换回整数
int value = (int)list[0];Console.WriteLine($"Value: {value}");
}
}using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> list = new List<int>();// 不需要装箱:整数直接存储为值类型
list.Add(42);// 不需要拆箱:整数直接检索为值类型
int value = list[0];Console.WriteLine($"Value: {value}");
}
}

5.使用 StringBuilder 替代字符串连接


使用场景:

说明:

  • StringBuilder 是为高效字符串操作而设计的,避免了不必要的中间对象。
  • 尤其适用于构建长字符串或需要多次修改字符串的场景

示例:

// 不使用 StringBuilder
string result = "";
for (int i = 0; i < 100; i++)
{
result += i.ToString(); // 创建多个中间字符串对象
}// 使用 StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++)
{
sb.Append(i.ToString());
}
string optimizedResult = sb.ToString(); // 更高效

6.使用 using 语句管理资源


使用场景:

说明:

  • using 语句确保对象在使用完后立即释放资源,减少内存压力。
  • 限定资源的生存周期,避免资源长时间占用。

示例:

using System;
using System.IO;class Program
{
static void Main()
{
string filePath = "example.txt";// 使用 using 语句确保文件在读取后正确关闭
using (StreamReader reader = new StreamReader(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
} // 离开 using 块时,reader 对象的 Dispose 方法被自动调用Console.WriteLine("文件读取完毕,资源已释放。");
}
}

7.合理使用弱引用 WeakReference 


使用场景:

说明:

  • 弱引用允许垃圾回收器回收未使用的对象,避免内存溢出。
  • 适合偶尔使用但不希望长期占用内存的对象。

示例:

using System;
using System.Collections.Generic;
using System.Drawing;class Program
{
// 使用字典来存储图像的弱引用缓存
static Dictionary<string, WeakReference> imageCache = new Dictionary<string, WeakReference>();static void Main()
{
string imagePath = "example.png";
Bitmap image = LoadImage(imagePath);if (image != null)
{
Console.WriteLine("图像已加载并缓存。");
}
else
{
Console.WriteLine("图像加载失败。");
}// 强制垃圾回收以演示弱引用效果
GC.Collect();
GC.WaitForPendingFinalizers();// 再次尝试从缓存加载图像
image = LoadImage(imagePath);
if (image != null)
{
Console.WriteLine("图像已从缓存中重新加载。");
}
else
{
Console.WriteLine("图像已被垃圾回收器回收。");
}
}static Bitmap LoadImage(string path)
{
if (imageCache.TryGetValue(path, out WeakReference weakRef) && weakRef.IsAlive)
{
Console.WriteLine("从缓存中获取图像...");
return weakRef.Target as Bitmap;
}
else
{
Console.WriteLine("加载新图像...");
Bitmap img = new Bitmap(path);// 将图像加载到缓存中
imageCache[path] = new WeakReference(img);
return img;
}
}
}

这些优化策略在合适的场景中可以显著提高内存使用效率,并提高应用程序的整体性能。根据具体的应用需求,选择适当的方法进行优化是关键。希望这些场景描述能帮助你更好地理解和应用这些内存优化策略!如果需要进一步的帮助,请随时提问。

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

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

相关文章

电子商务网站建设 代码学校诗歌网站建设

在存在缓存的情况下&#xff0c;删除较前的slide&#xff0c;会出现当前slide与后一个slide重复出现的情况 假设当前存在5个slide&#xff0c;且这5个slide已缓存&#xff0c;则删除slide2后&#xff0c;仍为5个slide&#xff0c;且slide2的内容变为slide3的内容&#xff0c;此…

老板合作网站开发网销怎么做

日常工作中经常需要确定各个指标的权重&#xff0c;利用熵值法确定权重属于客观赋权法&#xff0c;从数据出发&#xff0c;避免过强的主观性&#xff0c;但是也同时带来了一些问题。在某个论坛的帖子中&#xff0c;作者提出了这样的一个问题&#xff1a;“熵值法用于确定权重是…

整理数据制作 直方图,箱须图,概率密度估计(KDE)图

1.导入库和设置 import math import numpy as np import matplotlib.mlab as mlab import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[SimHei] # 设置中文字体,作用设置 matplotlib 使用中文字体显示…

云原生应用架构设计原则与落地实践:从理念到便捷的方法论

云原生应用架构设计原则与落地实践:从理念到便捷的方法论pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

做装饰公司网站6wordpress添加直达链接

问题描述&#xff1a;边缘计算设备是什么意思。 问题解答&#xff1a; 边缘计算&#xff08;Edge Computing&#xff09;是一种计算模型&#xff0c;其主要思想是在距离数据产生源头更近的地方进行数据处理和计算&#xff0c;而不是将所有数据传输到远程云服务器进行处理。边…

基于本地模型+多级校验设计的高效缓存,有效节省token数量(有点鸡肋doge) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

UCosIII 在 Tang Nano 20K 的 SparrowRV 软核移植

一直想完整的完成从FPGA到RTOS再到基础APP完成整个流程的理解,于是,尝试在开源的小麻雀操作系统上移植最简单的UCos-III移植,但由于不懂Verilog,所以磕磕碰碰,以下是其记录: 准备工作 由于使用的是一块小小的 Ta…

学做网站培训班要多少钱家电网站源码

2019独角兽企业重金招聘Python工程师标准>>> 1.安装oracle客户端 2.配置文件 加增一个数据库的方式,是编辑 tnsnames.ora文件,在C:\Oracle\Ora81\NETWORK\ADMIN 目录下. 增加类似下面的信息 SVR236 (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL …

深入解析:Elasticsearch的集群管理介绍

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SIP抓包工具 SIP抓包 SIP抓包

SIP抓包工具 SIP抓包 SIP抓包 CentOS 环境 sngrep 安装及使用在呼叫中心类应用开发过程中,经常需要对 SIP 信令抓包,分析排查问题。通常抓包的工具非常多样,如 Wireshark、tcpdump、ngrep 等都是可选项,但是针对…

2025声级计厂家最新权威推荐排行榜单! 数字声级计,精密声级计,防爆声级计,手持式声级计,剂量声级计公司推荐!

在噪声污染愈发受到重视的当下,从工业生产的机器轰鸣到城市交通的持续喧嚣,从建筑施工的阵阵嘈杂到日常环境中的各类声响,准确监测噪声强度成为管控污染的核心环节。而声级计作为专业测量工具,其品类丰富多样 ——…

US$78.85 KEYDIY KD ZB10-4 Universal Smart Remote Key (Start) 4 Buttons for Honda Type 5pcs/lot

KEYDIY KD ZB10-4 Universal Smart Remote Key (Start) 4 Buttons for Honda Type 5pcs/lot Manufacturer: KEYDIY Condition: New Buttons: 4 Color: Black Proximity / Smart / Keyless Go: Yes KEYDIY Remote Serie…

怎么套模板做网站建设众筹类网站

导航引言一、什么是配置中心二、常见的配置中心组件三、Nacos Config 入门四、Nacos Config 动态配置4.1 硬编码方式&#xff08;默认支持动态生效&#xff09;4.2 属性注入五、配置共享5.1 相同微服务不同环境间共享5.2 不同微服务配置共享六、Nacos Config 的几个概念总结引言…

深圳图派做的网站后台加什么做网站用win2008系统

作为DBA工作中都会遇到过数据库服务器CPU飙升的场景&#xff0c;我们该如何快速定位问题&#xff1f;又该如何快速找到具体是哪个SQL引发的CPU异常呢&#xff1f;下面我们说两个方法。聊聊MySQL中如何快速定位占用CPU过高的SQL。 技术人人都可以磨炼&#xff0c;但处理问题的思…

CPP中CAS std::chrono 信号量与Any类的手动达成

CPP中CAS std::chrono 信号量与Any类的手动达成2025-10-05 12:14 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display:…

网站开发公司的销售方式找客户在公司做网站

1 题目&#xff1a; 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 代码&#xff1a; class Solution { public:ListNode *detectCycle(ListNode *head) {} …

网站怎么做301跳转网站标题作弊详解

使用这个bundle的例子:键入ready然后按tab就会生成下面的代码:$(document).ready(function() { }); 其中第二行被选中,这时在里面编写jquery代码即可. 如果要查看某个function的官方文档的话可以在键入的function之后使用快捷键ctrlh 查看. 关于bundle的下载 这里是一个textmat…

python中使用高并发分布式队列库celery的那些坑 - 指南

python中使用高并发分布式队列库celery的那些坑 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

实用指南:Appium如何支持ios真机测试

实用指南:Appium如何支持ios真机测试pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名计算机控制AI框架需求洞察

本文基于某知名计算机控制AI框架的文档和用户反馈,深入分析其核心功能特性和使用方式,并挖掘出用户提出的关键新需求,为产品迭代提供重要参考方向。a.内容描述核心功能定位:该项目是一个开源的智能GUI代理框架,旨…