Teilen über


Memory- und Span-bezogene Typen

Ab .NET Core 2.1 umfasst .NET eine Reihe von zueinander in Beziehung stehender Typen, die eine zusammenhängende, stark typisierte Region eines beliebigen Speichers darstellen. Dazu gehören:

  • System.Span<T>: Dieser Typ wird verwendet, um auf einen zusammenhängenden Speicherbereich zuzugreifen. Eine Span<T>-Instanz kann sich auf ein Array vom Typ T, ein String, einen mit stackalloc zugeordneten Puffer oder auf einen Zeiger auf nicht verwalteten Speicher stützen. Da die Zuordnung im Stapel erfolgen muss, gelten einige Einschränkungen. Beispielsweise kann ein Feld in einer Klasse nicht den Typ Span<T> aufweisen, und ein Span-Element kann nicht in asynchronen Vorgängen verwendet werden.

  • System.ReadOnlySpan<T>: Eine unveränderliche Version der Span<T>-Struktur.

  • System.Memory<T>, ein Wrapper über einem zusammenhängenden Bereich des Speichers. Eine Memory<T>-Instanz kann durch ein Array vom Typ T, einen String oder einen Speicher-Manager gestützt werden. Memory<T> kann im verwalteten Heap gespeichert werden, deshalb gelten keine der Einschränkungen von Span<T>.

  • System.ReadOnlyMemory<T>: Eine unveränderliche Version der Memory<T>-Struktur.

  • 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>: Repräsentiert den Besitzer eines Speicherblocks und steuert die zugehörige Lebenszyklusverwaltung.

  • MemoryManager<T>: Eine abstrakte Basisklasse, mit der die Implementierung von Memory<T> ersetzt werden kann, sodass Memory<T> durch zusätzliche Typen, z.B. sichere Handles, gestützt werden kann. MemoryManager<T> ist ausschließlich für weiterführende Szenarien bestimmt.

  • ArraySegment<T>: Ein Wrapper für eine bestimmte Anzahl von Arrayelementen, beginnend bei einem bestimmten Index.

  • System.MemoryExtensions: Eine Sammlung von Erweiterungsmethoden für die Konvertierung von Zeichenfolgen, Arrays und Arraysegmenten in Memory<T>-Blöcke.

System.Span<T>, System.Memory<T> und ihre schreibgeschützten Entsprechungen sind so konzipiert, dass die Erstellung von Algorithmen ermöglicht wird, die das Kopieren von Arbeitsspeicher oder die Zuordnung auf dem verwalteten Heap über das Notwendige hinaus vermeiden. Ihre Erstellung (entweder über Slice oder ihre Konstruktoren) erfordert nicht das Duplizieren der zugrunde liegenden Puffer: nur die relevanten Verweise und Offsets, die die „Ansicht“ des umschlossenen Speichers darstellen, werden aktualisiert.

Hinweis

Für frühere Frameworkversionen stehen Span<T> und Memory<T> im NuGet-Paket „System.Memory“ zur Verfügung.

Weitere Informationen finden Sie unter den Ausführungen zum System.Buffers-Namespace.

Arbeiten mit Memory- und Span-Elementen

Die Memory- und Span-bezogenen Typen werden typischerweise zum Speichern von Daten in einer Verarbeitungspipeline verwendet, deshalb ist es wichtig, dass Entwickler bei der Verwendung von Span<T>, Memory<T> und zugehörigen Typen bestimmte Best Practices einhalten. Diese Best Practices werden im Leitfaden zur Verwendung von Memory<T> und Span<T> dokumentiert.

Siehe auch