共用方式為


Span2D<T>

Span2D<T>是一種型別,可鏡像型別的功能Span<T>,但它支援 2D 記憶體區域。 就像 是一樣 Memory2D<T>,它非常有彈性,而且可以包裝數個不同的物件,以及原生指標或 GC 參考。

內部配置類似於 類型所使用的 Memory2D<T> 配置,包括用來啟用對不連續記憶體緩衝區的支援的投向參數。 您可以在檔案中閱讀詳細資訊 Memory2D<T>

平臺 API:Span2D<T>、、 Memory2D<T>ReadOnlySpan2D<T>

語法

以下說明如何從 2D 陣列建立 Span2D<T> 實例:

int[,] array =
{
    { 1, 2, 3 },
    { 4, 5, 6 }
};

Span2D<int> span = array;

// The memory directly maps the 2*3 array here

span[0, 0] = 10;
span[2, 1] = 20;

// The array is now:
// { 10, 2, 3 },
// { 4, 20, 6 }

// We can also use indices, on supported runtimes
int x = span[0, ^1];

// We can also get references to items, like with arrays
ref int reference = ref span[1, 1];

Span2D<int> slice = span.Slice(0, 1, 2, 2);

// Or alternatively, on supported runtimes

slice = span[.., 1..];

int[,] copy = slice.ToArray();

// The resulting array is:
// { 2, 3 },
// { 20, 6 }

我們也可以直接建立原生記憶體的 2D 檢視:

int* p = stackalloc int[9];

Span2D<int> span = new Span2D<int>(p, 3, 3);

Span2D<T> 類型也包含自定義列舉值類型,以使用 C# 的標準 foreach 語法輕鬆周遊指定的數據列、數據行或整個記憶體區域,以及在單一呼叫中執行大量作業:

int[,] array =
{
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};

Span2D<int> span = array;

foreach (int i in span.GetColumn(1))
{
    // 2, 5, 8
}

// We can also iterate by reference
foreach (ref int i in span.GetRow(2))
{
    // 7, 8, 9
}

foreach (int i in span)
{
    // 1, 2, 3, 4, 5...
}

// Set all items in a column to 0
span.GetColumn(0).Clear();

// Set the value of all items in a row
span.GetRow(1).Fill(42);

Span<int> copy = stackalloc int[3];

// Copy all items from a column
span.GetColumn(2).CopyTo(copy);

// Get a copy of a row as an array
int[] array = span.GetRow(1).ToArray();

ReadOnlySpan2D<T>

ReadOnlySpan2D<T>是 ,Span2D<T>其類型為 ReadOnlySpan<T>Span<T> 它會公開一組類似的 API,但無法直接修改基礎記憶體區域的內容。

範例程式碼

您可以在單元測試中找到更多範例。