Span和Memory提供高效内存操作,Span适用于栈上安全切片,避免拷贝,提升性能;Memory支持跨方法边界和异步场景,结合ArrayPool可复用内存,减少GC压力,优化高频调用路径。

在处理高性能场景时,如何高效地操作内存一直是 .NET 开发中的关键问题。Span
Span:栈上安全的内存切片
Span
由于 Span
- 从数组创建 Span:int[] arr = {1, 2, 3}; var span = arr.AsSpan();
- 切片操作:var subSpan = span.Slice(1, 2); // 取索引1开始的两个元素
- 栈上分配:Span
stackSpan = stackalloc byte[256];
Memory:可跨方法边界的内存抽象
当需要将内存片段传递到异步方法或长期持有时,Span
Memory
- 异步读取文件或网络流时复用内存池(ArrayPool
.Shared) - 解析大型文本或二进制协议时分段处理
- 与 unsafe 代码交互时包装指针内存
性能对比与最佳实践
相比传统的 Substring 或 Array.Copy,Span
- 在同步、局部作用域优先使用 Span
- 涉及异步、需跨方法传递时使用 Memory
- 结合 System.Buffers 包中的 ArrayPool
实现内存复用 - 避免频繁将 Memory
转为 Span 在循环外保存 Span
基本上就这些。掌握 Span 和 Memory,意味着你掌握了现代 .NET 高性能编程的一把关键钥匙。用好它们,让内存操作更轻快、更可控。不复杂但容易忽略。











