Span和Memory是C#中用于高效内存操作的核心类型,Span适用于栈上同步高性能场景,Memory支持异步和堆传递,二者可互相转换,实现零分配内存处理。
c#高性能内存操作入门指南">
在C#中,Span
Span:栈上的高效内存视图
Span
常见用途包括:
- 切片数组而不复制数据
- 在不分配新对象的情况下传递子串或子数组
- 提升循环或解析性能
int[] numbers = { 1, 2, 3, 4, 5 };
Span span = numbers.AsSpan();
Span slice = span.Slice(1, 3); // 取索引1开始的3个元素:2,3,4
slice[0] = 9;
Console.WriteLine(numbers[1]); // 输出 9,原数组被修改
由于 Span
Memory:支持堆和异步的内存抽象
Memory
当你需要将内存片段传递给异步方法或缓存时,应使用 Memory
async Task ProcessDataAsync()
{
byte[] data = GetData();
Memory memory = data.AsMemory();
await ProcessChunkAsync(memory.Slice(0, 100));
}
async Task ProcessChunkAsync(Memory chunk)
{
// 可以在 await 后使用
var span = chunk.Span;
// 处理数据...
}
Memory
何时使用 Span 还是 Memory?
选择依据主要是使用场景:
- 如果在同步方法内部处理数据,追求极致性能 —— 用 Span
- 如果需要跨 await 使用、作为参数传递或存储在对象中 —— 用 Memory
- 两者可互相转换:.AsSpan() 和 .AsMemory()
例如,在高性能日志解析器中,先用 Memory
基本上就这些。掌握 Span 和 Memory 能显著提升 C# 程序的效率,特别是在 I/O 密集或高吞吐场景下。它们是现代 .NET 高性能编程的基石,理解其限制与优势,能让你写出更安全、更快的代码。









