内存和跨度相关类型Memory- and span-related types
本文内容
从 .NET Core 2.1 开始,.NET 包含多个相互关联的类型,它们表示任意内存的相邻强类型区域。这些方法包括:
System.Span
,用于访问连续内存区域的类型。Span 实例可由一组 T
类型、一个 String、一个使用 stackalloc 分配的缓冲区或一个指向非托管内存的指针提供支持。由于它必须在堆栈上进行分配,因此存在诸多限制。例如,类中的字段不能是 Span类型,跨度类型也不能在异步操作中使用。 System.ReadOnlySpan
,Span 结构的不可变版本。 System.Memory
,在托管堆而不是堆栈上分配的内存的相邻区域。Memory 实例可以由一组 T
类型或一个 String 提供支持。因为它可以存储在托管堆上,所以 Memory没有任何 Span 限制。 System.ReadOnlyMemory
,Memory 结构的不可变版本。 System.Buffers.MemoryPool
,它将强类型内存块从内存池分配给所有者。IMemoryOwner 实例可以通过调用 MemoryPool .Rent 从池中租用,并通过调用 MemoryPool.Dispose() 将其释放回池中。System.Buffers.IMemoryOwner
,表示内存块的所有者并控制其生存期管理。 MemoryManager
,一个抽象基类,可用于替换 Memory 的实现,以便 Memory 可以由其他类型(如安全句柄)提供支持。MemoryManager 适用于高级方案。 ArraySegment
,从特定索引开始的特定数量数组元素的包装器。 System.MemoryExtensions,用于将字符串、数组和数组段转换为 Memory
块的扩展方法集合。
备注
对于早期框架,Span<T> 和 Memory<T> 在 System.Memory NuGet 包中提供。
有关更多信息,请参见 System.Buffers 命名空间。
使用内存和跨度Working with memory and span
由于内存和跨度相关类型通常用于在处理管道中存储数据,因此开发人员在使用 Span<T>、Memory<T> 和相关类型时要务必遵循一套最佳做法。内存<T> 和跨度<T> 使用准则中介绍了这些最佳做法。