Span2D<T> sınıfı

Span2D<T> sınıfı, türün Span<T> işlevselliğini yansıtır, ancak 2B bellek bölgelerini destekler. gibi Memory2D<T>, son derece esnektir ve bir dizi farklı nesnenin yanı sıra yerel işaretçileri veya GC başvurularını sarmalayabilir.

İç düzen, Memory2D<T> türü tarafından kullanılan düzene benzer. Bu, bitişik olmayan bellek arabellekleri için destek sağlayan bir pitch parametresi içerir. Bu konuda daha fazla bilgiyi belgelerden Memory2D<T> okuyabilirsiniz.

Platform API'leri:Span2D<T>, Memory2D<T>, ReadOnlySpan2D<T>

Sözdizimi

İşte 2D dizisinden bir Span2D<T> örneğini nasıl oluşturabilirsiniz:

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[1, 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 }

Ayrıca yerel bellek üzerinde doğrudan bir 2B görünüm de oluşturabilirsiniz:

int* p = stackalloc int[9];

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

Tür, Span2D<T> C# dilinde standart foreach söz dizimini kullanarak belirli bir satır, sütun veya bellek alanının tamamında kolayca geçiş yapmak için özel numaralandırıcı türleri içerir. Ayrıca tek bir çağrıda toplu işlemler gerçekleştirmeyi de destekler:

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> türü, Span2D<T> türüne ne ise, ReadOnlySpan<T> de Span<T>'e odur. Benzer bir API kümesini kullanıma sunar, ancak temel alınan bellek alanının içeriğini doğrudan değiştirmenin hiçbir yolunu sağlamaz.

Örnek kodu

Birim testlerinde daha fazla örnek bulabilirsiniz.