【C# IO 操作 】System.Buffers
简介
.NET 包含多个相互关联的类型,它们表示任意内存的连续的强类型区域。 这些方法包括:
-
System.Span<T>
- 用于访问连续的内存区域
- 得到该类型的实例:
- 1个T类型的数组
- 1个
String
- 1个使用
stackalloc
分配的缓冲区 - 1个指向非托管内存的指针
- 实例必须存储在堆栈(stack)上,因此有很对限制
- 类的字段不能是此类型
- 不能在异步操作中使用
-
System.ReadOnlySpan<T>
Span<T>
结构体的不可变版本
-
System.Memory<T>
- 连续的内存区域的包装器
- 实例创建
T
类型数组String
- 内存管理器
- 实例可以存储在托管堆(managed heap)上,所以它没有
Span<T>
的限制
-
System.ReadOnlyMemory<T>
Memory<T>
结构的不可变版本。
-
System.Buffers.MemoryPool<T>
- 它将强类型内存块从内存池分配给所有者
IMemoryOwner<T>
实例可以通过调用MemoryPool<T>.Rent
从池中租用- 通过调用
MemoryPool<T>.Dispose()
将其释放回池中
- 它将强类型内存块从内存池分配给所有者
-
System.Buffers.IMemoryOwner<T>
- 表示内存块的所有者,管理其生命周期
-
MemoryManager<T>
- 一个抽象基类,可用于替换
Memory<T>
的实现,以便Memory<T>
可以由其他类型(如安全句柄(safe handles))提供支持 - MemoryManager<T> 适用于高级方案。
- 一个抽象基类,可用于替换
-
ArraySegment<T>
- 是数组的包装,对应数组中,从特定索引开始的特定数量的一系列元素
-
System.MemoryExtensions
- 用于将String、数组和数组段(
ArraySegment<T>
)转换为Memory<T>
块的扩展方法集
- 用于将String、数组和数组段(
System.Span<T>
、System.Memory<T>
及其对应的只读类型被设计为:
- 避免不必要地复制内存或在托管堆上进行内存分配
- 通过
Slice
方法或这些类型的的构造函数创建它们, 并不涉及复制底层缓冲(underlying buffers): 只更新相关引用和偏移- 形象的说就是,只更新我们可以访问到的内存的位置和范围,而不是将这些内存数据复制出来
备注:
对于早期框架,Span<T>
和Memory<T>
在 System.Memory NuGet 包中提供。
使用 memory 和 span
- 由于 memory 和 span 相关类型通常用于在处理 pipeline 中存储数据,因此开发人员在使用
Span<T>
、Memory<T>
和相关类型时要务必遵循一套最佳做法。Memory<T>
和Span<T>
使用准则中介绍了这些最佳做法。
编程是个人爱好