type
status
date
Jun 3, 2025 03:53 AM
slug
summary
tags
category
icon
password
Parent item
Sub-item
Span<T>
是 C# 7.2 引入的一个关键结构,属于 System.Memory 库的一部分,它为内存操作提供了高性能、安全且灵活的方式。1. 基本概念
Span<T>
是一个值类型的引用结构(ref struct),它表示内存中的连续区域,可以指向:- 托管堆上的数组
- 栈上分配的内存(stackalloc)
- 非托管内存
- 字符串的一部分(通过
ReadOnlySpan<char>
)
2. 主要特性
2.1 高性能
- 避免了数组拷贝
- 减少内存分配
- 允许直接访问内存
2.2 内存安全
- 自动边界检查
- 防止访问已释放的内存
2.3 灵活性
- 可以表示数组的子集
- 支持切片操作
3. 创建 Span<T>
4. 常用操作
4.1 切片(Slicing)
4.2 复制数据
4.3 访问元素
5. ReadOnlySpan<T>
ReadOnlySpan<T>
是 Span<T>
的只读版本,特别适合处理字符串等不可变数据:6. Span 的限制
由于
Span<T>
是 ref struct,有以下限制:- 不能作为类的字段
- 不能实现接口
- 不能放在堆上(如数组、集合中)
- 不能用于异步方法(async/await)
7. 实际应用场景
7.1 高性能字符串处理
7.2 解析二进制数据
7.3 零拷贝数据处理
8. Span 与相关类型比较
特性 | Span<T> | Array | Memory<T> | ReadOnlySequence<T> |
堆分配 | 无 | 是 | 是 | 是 |
栈分配 | 支持 | 不支持 | 不支持 | 不支持 |
可修改 | 是 | 是 | 是 | 只读 |
异步支持 | 否 | 是 | 是 | 是 |
连续内存 | 是 | 是 | 是 | 不一定 |
9. 最佳实践
- 优先使用
ReadOnlySpan<T>
当不需要修改数据时
- 避免长期存储 Span 的生命周期应短暂
- 小数据使用
stackalloc
- 大数据考虑
Memory<T>
当需要长期存储或在异步中使用时
- 注意边界检查 虽然自动进行,但错误的索引仍会抛出异常
Span<T>
是 C# 高性能编程的重要工具,合理使用可以显著提升应用程序性能,特别是在处理大量数据或需要低延迟的场景中。- 作者:琥珀
- 链接:https://www.dream-exception.com//article/cs.span
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。