.NET Core 2.1 includes some new types that make working with arrays and other memory types much more efficient. The new types include:
System.Span<T>
: Provides a type- and memory-safe representation of a contiguous region of arbitrary memory.System.ReadOnlySpan<T>
: Provides a type-safe and memory-safe read-only representation of a contiguous region of arbitrary memory.System.Memory<T>
: Represents a contiguous region of memory.System.ReadOnlyMemory<T>
: Represents a contiguous region of memory, similar to ReadOnlySpan<T>
. Unlike ReadOnlySpan<T>
, it is not a by ref like type.Without these types, when passing such items as a portion of an array or a section of a memory buffer, you have to copy some portion of the data before passing it to a method. These types provide a virtual view of that data that eliminates the need for additional memory allocation and copy operations.
The following example uses a Span<T>
and Memory<T>
instance to provide a virtual view of 10 elements of an array.
int[] numbers = new int[100];
for (int i = 0; i < 100; i++)
{
numbers[i] = i * 2;
}
var part = new Span<int>(numbers, start: 10, length: 10);
foreach (var value in part)
{
Console.Write($"{value} ");
}
When you run the above example, you will see the following output.
20 22 24 26 28 30 32 34 36 38