Span ‹T› - это новый тип, который будет доступен в .NET Core 2.1.

Чтобы упростить его, вы можете представить его как массив типов значений
, который можно разрезать на подблок без выделения памяти.

В следующем разделе я хотел бы представить несколько тестов и примеров кода.

В тесте сравнивается производительность нарезки массива с использованием:

  • Копирование массива
  • Span ‹T›
  • небезопасный указатель

Тесты доступны на GitHub ( используется BenchmarkDotNet).

Все тесты используют следующий массив:

public int[] Data = Enumerable.Range(0, 10_000_000).ToArray();

Классическая манипуляция с массивами:

Span ‹T› использует:

Указатель использует:

Результат был:

Method  |Mean         |Scaled |Rank   |Allocated  |
------- |------------:|------:|------:|----------:|
Array   |  4,966.5 us |  1.00 |     3 |    4032 B |
Span    |    162.9 us |  0.03 |     1 |       0 B |
Pointer |    175.3 us |  0.04 |     2 |       0 B |

Некоторые интересные факты о Span ‹T›:

  • Добавьте System.Memory NuGet, чтобы получить на него ссылку.
  • Он не может быть размещен в куче,
    поэтому не может быть членом класса.
  • Он может быть членом ref struct.
  • Он отлично подходит, когда вам нужно выполнить манипуляции со строкой, например SubString
    , например:
    «AbCD» .AsSpan () возвращает ReadOnlySpan ‹char›
    - - - - - - - - - - - - - - - - - - - - - -
    это означает, что вы можете использовать «ABCD» .AsSpan (). Slice (2,1)
    вместо «ABCD» .Substring (2,1).

Вы можете подробнее об этом прочитать в статье Стивена Тауба.