Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Memory2D<T> ist ein Typ, der die Funktionalität des Memory<T>-Typs widerspiegelt, wobei der Unterschied darin besteht, dass er verwendet werden kann, um 2D-Arbeitsspeicherorte darzustellen. Er ist äußerst flexibel und kann eine Reihe verschiedener Typen umschließen, einschließlich ND-Arrays (mit expliziter Unterstützung für 1D-, 2D- und 3D-Arrays) oder Memory<T>-Instanzen. Dieser Typ soll zusammen mit dem Span2D<T>-Typ verwendet werden, und zwar auf die gleiche Weise, wie Memory<T> zusammen mit Span<T> verwendet wird. Weitere Informationen zu den wichtigsten Unterschieden und Anwendungsfallszenarien dieser beiden Typen finden Sie in den Richtlinien zur Speicher-T-Verwendung<>.
Plattform-APIs:
Memory2D<T>,Span2D<T>,ReadOnlyMemory2D<T>
Funktionsweise
Der Memory2D<T>-Typ verfolgt intern den zugeordneten 2D-Arbeitsspeicherbereich durch einen Verweis auf das umschlossene Objekt, die Parameter für Höhe und Breite sowie einen speziellen Pitch-Parameter. Die Höhe und Breite geben die Länge der Zeilen und Spalten im 2D-Arbeitsspeicherbereich an, während der Abstand den Versatz zwischen dem Ende jeder Zeile und dem Anfang der folgenden Zeile angibt.
Hier ist ein einfaches Diagramm, das diese Konfiguration veranschaulicht (die Zellen „XX“ im Raster stellen Elemente dar, die zum 2D-Zielarbeitsspeicherbereich gehören):
// _____________________stride_____...
// reference__ /________width_________ ________...
// \/ \/
// | -- | -- | |- | -- | -- | -- | -- | -- | -- | -- |_
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- | |_height
// | -- | -- | XX | XX | XX | XX | XX | XX | -- | -- |_|
// | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
// | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
// ...__pitch__/
// ...________/
Diese Konfiguration ermöglicht es Memory2D<T>, extrem flexibel in der Art und Weise zu sein, wie es vorhandene Puffer zu 2D-Arbeitsspeicherbereichen zuordnet, da es möglich ist, auch nicht zusammenhängende Puffer als „virtuellen“ 2D-Arbeitsspeicherort darzustellen. Im Folgenden finden Sie einige Beispiele für Puffertypen, denen eine Memory2D Instanz zugeordnet werden kann:
- Ein 1D-Array, das als 2D-Speicherbereich in zeilenweiser Hauptreihenfolge
T[]abgebildet ist. - Ein 2D-
T[,]-Array, das direkt einerMemory2D<T>-Instanz zugeordnet ist. - Ein 3D-
T[,,]-Array mit einerMemory2D<T>-Instanz, die ein bestimmtes Tiefensegment (eine Ebene) darstellt.
Der Memory2D<T>-Typ macht auch eine Reihe von Hilfsmethoden verfügbar, einschließlich der meisten Hilfsmethoden der gleichen API-Oberfläche, die der Standard Memory<T> implementiert. Sie enthält z. B. eine Slice(int, int) Methode, mit der 2D-Slicing-Vorgänge direkt am virtuellen 2D-Speicherspeicherort ausgeführt werden können, wobei die Memory2D<T> Instanz die erforderlichen Parameter intern anpasst, um die Zuordnung in den richtigen Speicherbereichen zu verschieben, die dem angeforderten Ergebnis entsprechen.
Syntax
So können Sie eine Memory2D<T>-Instanz aus einem 2D-Array erstellen:
int[,] array =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Memory2D<int> memory = array;
// The memory directly maps the 2*3 array here.
Memory2D<int> slice = memory.Slice(0, 1, 2, 2);
// Create a slice from row 0 and column 1, of size 2*2.
int[,] copy = slice.ToArray();
// { 2, 3 }
// { 5, 6 }
// If on a supported runtime, you can also slice using a range:
Memory2D<int> test = memory[.., ..2];
// { 1, 2 }
// { 4, 5 }
// { 7, 8 }
Span2D<int> span = memory.Span;
// You can use the span to perform operations on the underlying
// data for the memory instance. All the available APIs are
// documented in the docs about the Span2D<T> type.
ReadOnlyMemory2D<T>
Der ReadOnlyMemory2D<T>-Typ verhält sich zu Memory2D<T> genau so, wie sich ReadOnlyMemory<T> zu Memory<T> verhält. Er macht dieselben genauen Funktionen verfügbar (ohne die APIs, die eine Änderung des Inhalts des umschlossenen Arbeitsspeicherbereichs beinhalten) und stellt eine schreibgeschützte Ansicht für beliebige 2D-Arbeitsspeicherorte bereit. Weitere Informationen zur Funktionsweise dieses Typs finden Sie im vorherigen Absatz des Memory2D<T> Typs.
Beispiele
Weitere Beispiele finden Sie in den Komponententests.
.NET Community Toolkit