Freigeben über


Memory- und Span-bezogene Typen

.NET enthält eine Reihe zusammenhängender Typen, die einen zusammenhängenden, stark typierten Bereich des beliebigen Speichers darstellen. Diese Typen sind so konzipiert, dass sie die Erstellung von Algorithmen ermöglichen, die das Kopieren von Speicher oder eine Zuweisung auf dem verwalteten Heap mehr als nötig vermeiden. Das Erstellen (entweder über Slice, AsSpan(), einen Sammlungsausdruck oder deren Konstruktoren) umfasst keine Duplizierung der zugrunde liegenden Puffer: Nur die relevanten Verweise und Offsets, die die "Ansicht" des umschlossenen Speichers darstellen, werden aktualisiert. Bei leistungsstarkem Code werden Spannweiten häufig verwendet, um unnötiges Zuordnen von Zeichenfolgen zu vermeiden.

Zu den Typen gehören:

  • System.Span<T>, einen Typ, der für den Zugriff auf einen zusammenhängenden Speicherbereich verwendet wird. Eine Span<T>-Instanz kann durch ein Array vom Typ T, einen mit stackalloc reservierten Puffer oder einen Zeiger auf nicht verwalteten Speicher gesichert werden. Da die Zuordnung im Stapel erfolgen muss, gelten einige Einschränkungen. Ein Feld in einer Klasse kann z. B. nicht vom Typ Span<T> sein, noch kann span in asynchronen Operationen verwendet werden.

  • System.ReadOnlySpan<T>, eine unveränderliche Version der Span<T> Struktur. Instanzen können außerdem von einem String unterstützt werden.

  • System.Memory<T>, ein Wrapper für einen zusammenhängenden Speicherbereich. Eine Memory<T> Instanz kann von einem Array vom Typ T oder einem Speicher-Manager unterstützt werden. Da es auf dem verwalteten Heap gespeichert werden kann, hat Memory<T> keine der Einschränkungen von Span<T>.

  • System.ReadOnlyMemory<T>, eine unveränderliche Version der Memory<T> Struktur. Instanzen können außerdem von einem String unterstützt werden.

  • System.Buffers.MemoryPool<T>: Ordnet einem Besitzer stark typisierte Speicherblöcke aus einem Speicherpool zu. IMemoryOwner<T>-Instanzen können durch Aufruf von MemoryPool<T>.Rent aus dem Pool bezogen und durch Aufruf von MemoryPool<T>.Dispose() wieder an den Pool zurückgegeben werden.

  • System.Buffers.IMemoryOwner<T>, der den Besitzer eines Speicherblocks darstellt und seine Lebensdauerverwaltung steuert.

  • MemoryManager<T>, eine abstrakte Basisklasse, die verwendet werden kann, um die Implementierung von Memory<T> zu ersetzen, sodass Memory<T> durch zusätzliche Typen wie sichere Handles unterstützt werden kann. MemoryManager<T> ist für erweiterte Szenarien vorgesehen.

  • ArraySegment<T>, ein Wrapper für eine bestimmte Anzahl von Arrayelementen ab einem bestimmten Index.

  • System.MemoryExtensions, eine Sammlung von Erweiterungsmethoden zum Konvertieren von Zeichenfolgen, Arrays und Arraysegmenten in Memory<T> Blöcke.

Weitere Informationen finden Sie im System.Buffers Namespace.

Arbeiten mit Memory- und Span-Elementen

Da die speicherbezogenen und span-bezogenen Typen in der Regel zum Speichern von Daten in einer Verarbeitungspipeline verwendet werden, ist es wichtig, dass Sie bei der Verwendung von Span<T>, Memory<T> und verwandten Typen bestimmte bewährte Methoden befolgen. Diese bewährten Methoden sind in den Richtlinien für die Verwendung von Arbeitsspeicher<T> und Span<T> dokumentiert.

Siehe auch