記憶體與延伸相關類型
從 .NET Core 2.1 開始,.NET 就包括一些相關類型,這些類型代表連續的強型別任意記憶體區域。 其中包括:
System.Span<T>,此類型是用來存取連續記憶體區域。 Span<T> 執行個體可由類型
T
的陣列、使用 stackalloc 配置的緩衝區或非受控記憶體的指標來支援。 因為它必須在堆疊上配置,它有一些限制。 例如,類別中欄位的類型不能是 Span<T>,而且延伸也不能用於非同步作業中。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.Span<T>、System.Memory<T>,以及其唯讀對應項目的設計目的是允許建立演算法,以避免複製過多記憶體或配置受控堆積。 建立這些項目 (無論是透過 Slice
或其建構函式) 並不會涉及基礎緩衝區的複製作業:系統只會更新代表已包裝記憶體「檢視」的相關參考和位移。
注意
針對較早的架構,Span<T> 與 Memory<T> 可在 System.Memory NuGet 套件中找到。
如需詳細資訊,請參閱 System.Buffers。
處理記憶體與延伸
因為記憶體與延伸相關類型通常用於將資料存放在處理管線中,開發人員在使用Span<T>、Memory<T> 與相關類型時務必依照一組最佳作法執行。 這些最佳做法記錄在記憶體<T>與延伸<T> 使用指導方針中。