Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это такой тип Memory2D<T>, который обеспечивает функциональность типа Memory<T>, с отличием, которое заключается в том, что он может использоваться для представления 2D-расположений памяти. Он чрезвычайно гибкий и способен обернуть ряд различных типов, включая массивы ND (с явной поддержкой 1D, 2D и 3D массивов) или экземпляры Memory<T>. Этот тип предназначен для использования вместе с типом Span2D<T> так же как Memory<T> используется вместе с Span<T>. Дополнительные сведения о ключевых различиях и сценариях использования этих двух типов см. в рекомендациях по использованию памяти<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
T[], который отображается как 2D область памяти в порядке строк. - Массив
T[,]2D, непосредственно сопоставленный с экземпляромMemory2D<T>. - Трехмерный
T[,,]массив с экземпляромMemory2D<T>, представляющим заданный срез глубины (слой).
Тип Memory2D<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);
// 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>
Тип ReadOnlyMemory2D<T> относится к типу Memory2D<T> так же, как ReadOnlyMemory<T> относится к Memory<T>. Он предоставляет те же самые функциональные возможности (за исключением API, которые включают изменение содержимого завернутой области памяти) и предоставляет представление только для чтения в произвольные двухмерные расположения памяти. Дополнительные сведения о том, как работает этот тип, см. в предыдущем абзаце типа Memory2D<T> .
Примеры
Дополнительные примеры можно найти в модульных тестах.
.NET Community Toolkit