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. 最佳实践

  1. 优先使用 ReadOnlySpan<T> 当不需要修改数据时
  1. 避免长期存储 Span 的生命周期应短暂
  1. 小数据使用 stackalloc 减少GC压力
  1. 大数据考虑 Memory<T> 当需要长期存储或在异步中使用时
  1. 注意边界检查 虽然自动进行,但错误的索引仍会抛出异常
Span<T> 是 C# 高性能编程的重要工具,合理使用可以显著提升应用程序性能,特别是在处理大量数据或需要低延迟的场景中。
排序算法添加编辑器菜单
Loading...