メモリおよびスパンに関連する型Memory- and span-related types

.NET Core 2.1 以降、.NET には、任意のメモリの厳密に型指定された連続する領域を表す、相互に関連する型が多数含まれています。Starting with .NET Core 2.1, .NET includes a number of interrelated types that represent a contiguous, strongly typed region of arbitrary memory. 次の設定があります。These include:

  • System.Span<T>: メモリの連続した領域にアクセスするために使う型です。System.Span<T>, a type that is used to access a contiguous region of memory. Span<T> インスタンスは、T 型の配列、Stringstackalloc を使って割り当てたバッファー、またはアンマネージ メモリへのポインターによってバックアップできます。A Span<T> instance can be backed by an array of type T, a String, a buffer allocated with stackalloc, or a pointer to unmanaged memory. これはスタック上に割り当てる必要があるため、いくつかの制限があります。Because it has to be allocated on the stack, it has a number of restrictions. たとえば、クラス内のフィールドを Span<T> 型にすることはできませんし、非同期操作でスパンを使うこともできません。For example, a field in a class cannot be of type Span<T>, nor can span be used in asynchronous operations.

  • System.ReadOnlySpan<T>: Span<T> 構造体の変更できないバージョンです。System.ReadOnlySpan<T>, an immutable version of the Span<T> structure.

  • System.Memory<T>: スタックではなくマネージド ヒープ上に割り当てられるメモリの連続する領域です。System.Memory<T>, a contiguous region of memory that is allocated on the managed heap rather than the stack. Memory<T> インスタンスは、T 型の配列か String によってバックアップできます。A Memory<T> instance can be backed by an array of type T or a String. これはマネージド ヒープに格納できるため、Memory<T> には Span<T> の制限事項はありません。Because it can be stored on the managed heap, Memory<T> has none of the limitations of Span<T>.

  • System.ReadOnlyMemory<T>: Memory<T> 構造体の変更できないバージョンです。System.ReadOnlyMemory<T>, an immutable version of the Memory<T> structure.

  • System.Buffers.MemoryPool<T>: メモリ プールの厳密に型指定されたメモリ ブロックを、所有者に割り当てます。System.Buffers.MemoryPool<T>, which allocates strongly typed blocks of memory from a memory pool to an owner. IMemoryOwner<T> インスタンスは、MemoryPool<T>.Rent を呼び出すことでプールから借りてくることができ、MemoryPool<T>.Dispose() を呼び出すことでプールにリリースします。IMemoryOwner<T> instances can be rented from the pool by calling MemoryPool<T>.Rent and released back to the pool by calling MemoryPool<T>.Dispose().

  • System.Buffers.IMemoryOwner<T>: メモリ ブロックの所有者を表し、その有効期間の管理をコントロールします。System.Buffers.IMemoryOwner<T>, which represents the owner of a block of memory and controls its lifetime management.

  • MemoryManager<T>: Memory<T> をセーフ ハンドルなどのその他の型でバックアップできるようにするために、Memory<T> の実装を置き換えるために使用できる抽象基本クラスです。MemoryManager<T>, an abstract base class that can be used to replace the implementation of Memory<T> so that Memory<T> can be backed by additional types, such as safe handles. MemoryManager<T> は高度なシナリオ向けです。MemoryManager<T> is intended for advanced scenarios.

  • ArraySegment<T>: 特定のインデックスから始まる、特定の数の配列要素のラッパーです。ArraySegment<T>, a wrapper for a particular number of array elements starting at a particular index.

  • System.MemoryExtensions: 文字列、配列、および配列セグメントを、Memory<T> ブロックに変換するための拡張メソッドのコレクションです。System.MemoryExtensions, a collection of extension methods for converting strings, arrays, and array segments to Memory<T> blocks.

注意

以前のフレームワークでは、System.Memory NuGet パッケージSpan<T>Memory<T> を利用できます。For earlier frameworks, Span<T> and Memory<T> are available in the System.Memory NuGet package.

詳細については、「System.Buffers」を参照してください。For more information, see the System.Buffers namespace.

メモリとスパンを使った作業Working with memory and span

通常、メモリおよびスパンに関連する型は処理パイプラインにデータを格納するために使われます。そのため開発者は、Span<T>Memory<T>、および関連する型を使う場合に、一連のベスト プラクティスに従うことが重要です。Because the memory- and span-related types are typically used to store data in a processing pipeline, it is important that developers follow a set of best practices when using Span<T>, Memory<T>, and related types. これらのベスト プラクティスは、「Memory<T>T> と Span<T>T> の使用ガイドライン」でドキュメント化されています。These best practices are documented in Memory<T> and Span<T> usage guidelines.

関連項目See also