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

C#拆箱/装箱(性能优化)

目录

1.什么是装箱/拆箱

2.性能杀手:隐式装箱

3.性能优化方案

3.1 使用泛型集合替代非泛型集合

3.2 使用StringBuilder和插值优化字符串操作

3.3 使用结构体或者值元组

1.什么是装箱/拆箱

装箱是将值类型转换为引用类型的过程,拆箱则相反。看似简单的操作,背后却隐藏着巨大的性能开销:

// 装箱 - 值类型转换为object
int value = 42;
object boxed = value;  // 在堆上分配内存,复制数据// 拆箱 - object转换回值类型  
int unboxed = (int)boxed;  // 类型检查 + 数据复制

2.性能杀手:隐式装箱

static void Main(string[] args){// 看似无害的代码,实际上发生了大量装箱var list = new ArrayList();for (int i = 0; i < 1000000; i++){list.Add(i);  // 每次都装箱!}// 字符串拼接中的隐式装箱string result = "";for (int i = 0; i < 10000; i++){result += "Number: " + i;  // i被装箱转换为object}}

3.性能优化方案

3.1 使用泛型集合替代非泛型集合

泛型集合明确集合类型,防止出现隐式装箱操纵

// 高性能:使用泛型List<T>
publicclass OptimizedExample
{public void ProcessNumbers(){List<int> numbers = new List<int>();// 无装箱:直接存储值类型for (int i = 0; i < 100000; i++){numbers.Add(i);}// 无拆箱:直接访问值类型int sum = 0;foreach (int num in numbers){sum += num;  // 直接操作,无类型转换}}
}

3.2 使用StringBuilder和插值优化字符串操作

问题代码:

// 字符串拼接中的装箱陷阱
public string FormatNumbers(int[] numbers)
{string result = "";foreach (int num in numbers){result += "Value: " + num + ", ";  // num被装箱}return result;
}

优化代码:

// 使用StringBuilder和字符串插值避免装箱
public string FormatNumbersOptimized(int[] numbers)
{var sb = new StringBuilder();foreach (int num in numbers){sb.Append($"Value: {num}, ");  // 直接格式化,避免装箱}return sb.ToString();
}// 更高效的Span<T>方式(.NET Core 2.1+)
public string FormatNumbersWithSpan(ReadOnlySpan<int> numbers)
{var sb = new StringBuilder();foreach (int num in numbers){sb.Append("Value: ");sb.Append(num);  // 直接追加值类型sb.Append(", ");}return sb.ToString();
}

3.3 使用结构体或者值元组

问题代码:

 // 装箱发生在这里object[] data = { 42, "Hello", 3.14, true };// 拆箱发生在这里int intVal = (int)data[0];string strVal = (string)data[1];double doubleVal = (double)data[2];bool boolVal = (bool)data[3];

优化代码:

var data = new DataItem(42, "Hello", 3.14, true);  // 无装箱
//值元组
var data = (IntValue: 42, StringValue: "Hello", DoubleValue: 3.14, BoolValue: true);

3.4 使用Memory和Span优化内存操作

问题代码:

// 传统数组操作可能导致装箱
public int SumArray(object[] values)
{int sum = 0;for (int i = 0; i < values.Length; i++){sum += (int)values[i];  // 拆箱操作}return sum;
}

优化代码:

// 使用Span<T>和Memory<T>零拷贝操作
public int SumArrayOptimized(ReadOnlySpan<int> values)
{int sum = 0;for (int i = 0; i < values.Length; i++){sum += values[i];  // 直接访问,无装箱拆箱}return sum;
}// 更安全的Memory<T>版本
public int SumMemory(ReadOnlyMemory<int> memory)
{var span = memory.Span;int sum = 0;foreach (int value in span){sum += value;}return sum;
}// 实际使用示例
public void UseOptimizedArrays()
{int[] numbers = { 1, 2, 3, 4, 5 };// 零拷贝操作int sum1 = SumArrayOptimized(numbers);int sum2 = SumMemory(numbers.AsMemory());
}

记住这三个黄金法则:

  • 能用泛型就用泛型

    类型安全且高性能

  • 值类型优于引用类型

    减少堆分配和GC压力

  • Span/Memory是性能利器

    零拷贝操作的最佳选择

http://www.dtcms.com/a/487607.html

相关文章:

  • 深圳市做网站建设wordpress 获取子分类
  • 网站推广排名平台做网站常州
  • 企业配电柜里的“防火卫士”——ATE800无线测温传感器,让设备更安全!
  • 如何使用云手机进行游戏挂机?
  • 网站自适应手机代码百度网盘资源搜索引擎搜索
  • 做网站的手机软件河北住房和城乡建设厅网站卡
  • 设计模式(解释器模式(Interpreter Pattern)结构|原理|优缺点|场景|示例
  • 我的家乡网站设计模板中国网站备案信息查询
  • 站酷设计网站官网入口文字设计企业为什么需要手机网站
  • `ztask` 轻量级合作式任务调度器
  • Segment Anything(SAM)
  • string 1 easy
  • 全球著名科技网站手机自助建站系统
  • LRU Cache 最近最少使用
  • h5游戏免费下载:跳一跳
  • 用asp做网站深圳市点击未来科技网站建设
  • EtherCAT转EtherNet/IP工业模块:数据网关实现电子制造业协议转换
  • 傻瓜式建网站泰兴市建设局网站
  • 制作一个网站做网站做哪个
  • SkipList跳表
  • BEVFUSION解读(八)
  • 网站的icp备案怎么在百度做网站
  • SAP MM 自制=>外协加工
  • Spring Boot临时解决循环依赖注入问题
  • 数字身份安全在重点行业的应用与机遇:现状复盘、需求洞察与趋势展望
  • 网站三元素怎么做网站流量建设
  • wordpress单本小说站wordpress如何做页面模板下载
  • seo在网站建设中的作用网站开发怎么使用维语
  • 个人创业:如何找到适合自己且值得投入的小项目?
  • Go 语言开发工具