LabVIEWer 2026-4-17 14:18:00 | 显示全部楼层 | 阅读模式

『7x24小时有问必答』
1.png

前言

嗨,C# 的程序员小伙伴们,早上好!
你是不是也厌倦了那些繁琐的内存拷贝操作?
每次看到Substring创建新字符串或者数组切片复制数据时,是不是感觉性能在悄悄流失?
今天我要给你介绍一个游戏规则改变者——Span<t>
这个从 C# 7.2 开始引入的神器,它提供了一种安全、高效的方式来访问连续的内存区域,能让你的代码跑得飞快,同时保持安全和简洁。
准备好升级你的 C# 技能了吗?让我们开始这段 Span 之旅吧!

什么是Span?

Span<t>  是 .NET 提供的一种值类型,它允许你以安全的方式访问连续内存区域,无论这块内存来自堆、栈还是非托管内存。
简单来说,你可以把它想象成一个 "视图" 或 "窗口",能让你查看和操作内存,而无需实际复制数据。
下面我们通过一个例子来感受它的魅力。

例子

假设我们要将字符串的内容反转打印出来,来看看传统方式和使用Span方式实现的差别,留意代码中的注释

传统方式

using  System;

class  Program

{

       static  void  Main()

      {

             string  original =  "Hello, Span World!";

             // 传统方式:分配新字符串

             string  traditionalReversed = TraditionalReverse(original);

            Console.WriteLine($"传统方式:  {traditionalReversed}");

      }

       // 传统字符串反转,需要多次内存分配

       static  string  TraditionalReverse(string  input)

      {

             if  (string.IsNullOrEmpty(input))  return  input;

             char[] chars = input.ToCharArray();

            Array.Reverse(chars);

             return  new  string(chars);

      }

}

Span 方式

using  System;

class  Program

{

       static  void  Main()

      {

             string  original =  "Hello, Span World!";

             // Span方式:几乎零分配

             string  spanReversed = SpanReverse(original);

            Console.WriteLine($"Span方式:  {spanReversed}");

      }

       // 使用 Span 的字符串反转,减少了中间内存分配,几乎无内存分配

       // 使用 ReadOnlySpan<char> 安全地表示不可变视图

       static  string  SpanReverse(ReadOnlySpan<char> input)

      {

             if  (input.IsEmpty)  return  string.Empty;

             // 创建可写的Span(这里实际上会分配内存因为要返回字符串)

            Span<char> reversed =  new  char[input.Length];

            input.CopyTo(reversed);

            reversed.Reverse();  // Span.Reverse() 是原地操作,非常高效

             // 虽然最后要创建字符串,但过程中避免了多次分配

             return  reversed.ToString();

      }

}

运行

按 Ctrl+F5 运行程序,即可看到如下图的结果:
2.png

使用场景

Span<t>  的黄金法则是 "不分配,只查看",它直接引用现有的内存区域,减少了不必要的内存分配,降低了内存拷贝的需求,提高了数据处理速度。
这使得  Span<t>  很适合下面这些业务场景:
当需要处理大量数据时,使用  Span<t>  可以显著提升性能
解析网络包、文件格式等二进制数据
优化字符串操作,比如截取子串、转换编码等操作时,使用  Span<char>  而不是创建新的字符串实例

总结

虽然  Span<t>  不是什么银弹,但在处理内存敏感操作时,它能带来惊人的性能提升。
建议从字符串和数组处理开始尝试,慢慢体会它的魔力,相信你会爱上这个高性能工具的!
好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!
最后,如果你有更好的想法或建议,欢迎留言讨论!
往期精彩
我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得,每周一、周三和周五早上 7:20 分,和你相约!欢迎关注,和你共同探索代码世界的奥秘!
喜欢文章欢迎点个【赞与在看】,你的支持是我最大的动力!

</t></char></t></t></t></char></t></t>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码