0Pricing
C# Academy · Урок

Основы Span/ReadOnlySpan (эмуляция в C# 6)

Эмулируйте Span/ReadOnlySpan с помощью ArraySegment : создавайте представления массивов, выделяйте срезы по смещению и длине и обрабатывайте данные без копирования.

«Основы Span/ReadOnlySpan (эмуляция в C# 6)» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Зачем нужны срезы

Цель: работать со срезами без дополнительных выделений памяти.

  • Используйте ArraySegment<T> как представление
  • Делите по смещению и количеству
  • Пишите методы, принимающие ArraySegment<T>
  • Сохраняйте операции простыми и безопасными

Представление без копирования

ArraySegment<T> — это представление части массива без копирования. Передавайте его методам, чтобы избежать копий при создании срезов.

using System;

public class Program
{
  static int Sum(ArraySegment<int> seg)
  {
    int acc = 0;
    int end = seg.Offset + seg.Count;
    for (int i = seg.Offset; i < end; i++) acc += seg.Array[i];
    return acc;
  }

  public static void Main(string[] args)
  {
    int[] data = new int[] { 2, 4, 6, 8, 10 };
    ArraySegment<int> middle3 = new ArraySegment<int>(data, 1, 3); // 4,6,8
    Console.WriteLine("Sum = " + Sum(middle3)); // 18
  }
}

Вложенные срезы

Можно создать вспомогательный метод Slice, который получает поддиапазон существующего сегмента. Копирования по-прежнему не происходит.

using System;

public static class Seg
{
  public static ArraySegment<T> Slice<T>(ArraySegment<T> seg, int start, int count)
  {
    if (start < 0 || count < 0 || start + count > seg.Count) throw new ArgumentOutOfRangeException();
    return new ArraySegment<T>(seg.Array, seg.Offset + start, count);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    string[] words = new string[] { "alpha", "beta", "gamma", "delta", "epsilon" };
    ArraySegment<string> mid = new ArraySegment<string>(words, 1, 3);  // beta, gamma, delta
    ArraySegment<string> inner = Seg.Slice<string>(mid, 1, 1);         // gamma
    Console.WriteLine(inner.Array[inner.Offset]); // gamma
  }
}

Работа с представлением на месте

Работайте через смещение/количество, чтобы не создавать подстроки; это соответствует обрезке на основе ReadOnlySpan.

using System;

public static class SegOps
{
  public static ArraySegment<char> Trim(ArraySegment<char> seg)
  {
    int start = seg.Offset;
    int end = seg.Offset + seg.Count - 1;

    while (start <= end && Char.IsWhiteSpace(seg.Array[start])) start++;
    while (end >= start && Char.IsWhiteSpace(seg.Array[end])) end--;

    int newCount = (end >= start) ? (end - start + 1) : 0;
    return new ArraySegment<char>(seg.Array, start, newCount);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    char[] buf = "   hello world   ".ToCharArray(); // single allocation for chars
    ArraySegment<char> all = new ArraySegment<char>(buf, 0, buf.Length);
    ArraySegment<char> trimmed = SegOps.Trim(all);

    // Print the trimmed part without new string:
    for (int i = 0; i < trimmed.Count; i++)
      Console.Write(trimmed.Array[trimmed.Offset + i]);
    Console.WriteLine();
  }
}

Создание копии по требованию

Иногда нужна настоящая копия. Материализуйте сегмент в новый массив только на границе.

using System;

public static class SegCopy
{
  public static T[] ToArray<T>(ArraySegment<T> seg)
  {
    T[] copy = new T[seg.Count];
    Array.Copy(seg.Array, seg.Offset, copy, 0, seg.Count);
    return copy;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    int[] data = new int[] { 1, 2, 3, 4, 5, 6 };
    ArraySegment<int> view = new ArraySegment<int>(data, 2, 3); // 3,4,5

    int[] materialized = SegCopy.ToArray<int>(view); // copy only when you must
    Console.WriteLine(string.Join(",", materialized));
  }
}

Советы и ограничения

Советы:

  • Проектируйте API так, чтобы при работе с массивами он принимал ArraySegment<T>.
  • Следите за смещением и количеством.
  • Копируйте только на границах (ввод-вывод, взаимодействие систем).
  • Современный Span обеспечивает безопасность и представления в стеке; здесь мы используем сегменты, чтобы освоить принцип работы со срезами.

Имитация срезов в C# 6

Быстрая проверка: какой тип C# 6 лучше всего имитирует срез (представление) части массива без копирования?

Повторение

Повторение: используйте ArraySegment<T> для представления поддиапазонов, пишите API, принимающий сегменты, работайте через смещение и количество и копируйте только при необходимости.

Часто задаваемые вопросы

Урок «Основы Span/ReadOnlySpan (эмуляция в C# 6)» бесплатный?

Да — полный текст урока «Основы Span/ReadOnlySpan (эмуляция в C# 6)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Основы Span/ReadOnlySpan (эмуляция в C# 6)»?

Эмулируйте Span/ReadOnlySpan с помощью ArraySegment : создавайте представления массивов, выделяйте срезы по смещению и длине и обрабатывайте данные без копирования. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Основы Span/ReadOnlySpan (эмуляция в C# 6)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы Span/ReadOnlySpan (эмуляция в C# 6)
  2. Эмуляция Memory/ReadOnlyMemory: окна без копирования
  3. API «строка как Span» (эмуляция в C# 6)
← Назад к C# Academy