Память2D<T>
Это Memory2D<T>
тип, который отражает функциональность Memory<T>
типа, с отличием, что может использоваться для представления 2D-расположений памяти. Он очень гибкий и способен упаковать ряд различных типов, включая массивы ND (с явной поддержкой 1D, 2D и трехмерных массивов) или Memory<T>
экземпляров. Этот тип предназначен для использования вместе с Span2D<T>
типом, так же, как Memory<T>
и для использования вместе с Span<T>
ним. Дополнительные сведения о ключевых различиях и сценариях использования этих двух типов см . на этой странице документации.
API платформы:
Memory2D<T>
, ,Span2D<T>
ReadOnlyMemory2D<T>
Принцип работы
Тип Memory2D<T>
внутренне отслеживает сопоставленную область памяти 2D через ссылку на упакованный объект, параметры высоты и ширины и специальный параметр шага. Высота и ширина указывают длину строк и столбцов в области памяти 2D, а шаг указывает смещение между концами каждой строки и началом следующей.
Ниже приведена простая схема, демонстрирующая эту конфигурацию (ячейки XX в сетке представляют элементы, принадлежащие целевой области памяти 2D):
// _____________________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__/
// ...________/
Эта конфигурация позволяет Memory2D<T>
быть чрезвычайно гибкой в том, как она сопоставляет существующие буферы с областями памяти 2D, так как это позволяет также представлять дискоднообразные буферы как "виртуальное" расположение памяти 2D. Например, вот несколько примеров типов буферов, с которыми Memory2D
может сопоставить экземпляр:
- 1D-массив, сопоставленный как область памяти 2D
T[]
в основном порядке строк. - Массив 2D
T[,]
, сопоставленный непосредственно с экземпляромMemory2D<T>
. - Трехмерный
T[,,]
массив с экземпляромMemory2D<T>
, представляющим заданный срез глубины (слой).
Тип Memory<T>
также предоставляет ряд служебных методов, включая большую часть той же поверхности API, что и стандартная Memory<T>
реализация. Например, он включает Slice(int, int)
метод, который упрощает выполнение операций срезов 2D непосредственно в расположении виртуальной 2D-памяти, при Memory2D<T>
этом экземпляр автоматически настраивает необходимые параметры внутренне, чтобы переместить его сопоставление в правой области памяти, соответствующей запрошенным результатам.
Синтаксис
Вот как создать Memory2D<T>
экземпляр из массива 2D:
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);
// We 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, we can also slice using a range
Memory2D<int> test = memory[.., ..2];
// { 1, 2 }
// { 4, 5 }
// { 7, 8 }
Span2D<int> span = memory.Span;
// We 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>
Memory2D<T>
ТипReadOnlyMemory2D<T>
, который ReadOnlyMemory<T>
требуетсяMemory<T>
. Он предоставляет те же точные функциональные возможности (минус API,которые включают изменение содержимого области памяти в оболочке) и предоставляют представление только для чтения в произвольные расположения памяти 2D. Дополнительные сведения о том, как работает этот тип, см. в абзаце выше.Memory2D<T>
Примеры
Дополнительные примеры можно найти в модульных тестах.
.NET Community Toolkit