メモリおよびスパンに関連する型
.NET Core 2.1 以降、.NET には、任意のメモリの厳密に型指定された連続する領域を表す、相互に関連する型が多数含まれています。 次の設定があります。
System.Span<T>: メモリの連続した領域にアクセスするために使う型です。 Span<T> インスタンスは、
T
型の配列、String、stackalloc を使って割り当てたバッファー、またはアンマネージ メモリへのポインターによってバックアップできます。 これはスタック上に割り当てる必要があるため、いくつかの制限があります。 たとえば、クラス内のフィールドを Span<T> 型にすることはできませんし、非同期操作でスパンを使うこともできません。System.ReadOnlySpan<T>: Span<T> 構造体の変更できないバージョンです。
System.Memory<T>: メモリの隣接した領域に対するラッパーです。 Memory<T> インスタンスは、
T
型の配列、String、またはメモリ マネージャーによってバックアップできます。 これはマネージド ヒープに格納できるため、Memory<T> には 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> の実装を置き換えるために使用できる抽象基本クラスです。 MemoryManager<T> は高度なシナリオ向けです。
ArraySegment<T>: 特定のインデックスから始まる、特定の数の配列要素のラッパーです。
System.MemoryExtensions: 文字列、配列、および配列セグメントを、Memory<T> ブロックに変換するための拡張メソッドのコレクションです。
System.Span<T>、System.Memory<T>、およびそれらに対応する読み取り専用の型は、必要以上にメモリをコピーしたり、マネージド ヒープに割り当てたりすることのないアルゴリズムを作成できるように設計されています。 (Slice
またはそれらのコンストラクターを使用して) それらを作成しても、基になるバッファーの複製は行われません。ラップされたメモリの "ビュー" を表す関連する参照とオフセットのみが更新されます。
注意
以前のフレームワークでは、System.Memory NuGet パッケージで Span<T> と Memory<T> を利用できます。
詳細については、「System.Buffers」を参照してください。
メモリとスパンを使った作業
通常、メモリおよびスパンに関連する型は処理パイプラインにデータを格納するために使われます。そのため開発者は、Span<T>、Memory<T>、および関連する型を使う場合に、一連のベスト プラクティスに従うことが重要です。 これらのベスト プラクティスは、「Memory<T> と Span<T> の使用ガイドライン」でドキュメント化されています。