.NET 包含一些相互關聯的類型,這些類型代表任意記憶體的連續強型別區域。 這些類型是設計來允許建立演算法,以避免超出必要地進行記憶體複製或在受控堆上配置。 建立它們(透過 Slice
、AsSpan()
、集合表達式或其建構函式)並不涉及複製基礎緩衝區:只會更新代表包裝記憶體「視圖」的相關參考和位移。 在高效能程序代碼中,通常會使用範圍來避免不必要地配置字串。
類型包括:
System.Span<T>,這是用來存取連續記憶體區域的型別。 Span<T> 實例可以由
T
類型的陣列、通過 stackalloc 配置的緩衝區,或指向非受控記憶體的指標所支援。 因為它必須分配在堆疊上,因此有一些限制。 例如,類別中的欄位不能是Span<T>型,也不能在異步作業中使用 span。System.ReadOnlySpan<T>,結構不可變的版本 Span<T> 。 實例也可以由String作為後端支援。
System.Memory<T>,包裹在連續記憶體區域之上的包裝器。 Memory<T> 實例可以由類型為
T
或記憶體管理器的陣列提供支援。 由於它可以儲存在受控堆區上,Memory<T> 不會像 Span<T> 那樣有限制。System.ReadOnlyMemory<T>,結構不可變的版本 Memory<T> 。 實例也可以由 String來支援。
System.Buffers.MemoryPool<T>,它會將強型別的記憶體區塊從記憶體集區配置給擁有者。 IMemoryOwner<T> 實例可以透過呼叫 MemoryPool<T>.Rent 從池中租用,並透過呼叫 MemoryPool<T>.Dispose() 來釋放回池中。
System.Buffers.IMemoryOwner<T>,表示記憶體區塊的擁有者,並控制其存留期管理。
MemoryManager<T> 是一個抽象基類,可用來取代 Memory<T> 的實作,以便讓 Memory<T> 可以被其他類型支援,例如安全句柄。 MemoryManager<T> 適用於進階案例。
ArraySegment<T>,用於從特定索引開始的特定數量陣列元素的包裝器。
System.MemoryExtensions,擴充方法的集合,可將字串、陣列和陣列區段轉換成 Memory<T> 區塊。
如需詳細資訊,請參閱 System.Buffers 命名空間。
使用記憶體和範圍
由於記憶體相關和跨範圍相關類型通常用於將數據儲存在處理管線中,因此請務必在使用Span<T>、Memory<T>和相關類型時遵循一組最佳做法。 這些最佳做法記載於 記憶體<T> 和Span<T> 使用指導方針中。