C# Academy · 课时

Span/ReadOnlySpan 基础(C# 6 模拟)

使用 ArraySegment 模拟 Span/ReadOnlySpan:创建数组视图,通过偏移量和长度切片,并在不复制的情况下处理数据。

第 1 / 3 课8 个步骤

Span/ReadOnlySpan 基础(C# 6 模拟) 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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
  }
}

嵌套切片

可以构建切片辅助方法,从现有片段中获取子范围。整个过程仍然是零拷贝。

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();
  }
}

按需物化

有时需要真正的副本。只在边界处将片段Materialize到新数组中。

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>。
  • 跟踪偏移量和数量。
  • 只在边界处复制(输入输出、互操作)。
  • 现代范围类型提供安全性和栈上视图;这里使用片段来学习切片思维。

C# 6 中的切片模拟

快速检查:在 C# 6 中,哪种类型最适合模拟数组某一部分的不复制切片(视图)?

回顾

回顾:使用ArraySegment<T>查看子范围,编写接受片段的 API,通过偏移量/数量进行操作,并仅在必要时复制。

免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「Span/ReadOnlySpan 基础(C# 6 模拟)」课时是免费的吗?

是的 — 「Span/ReadOnlySpan 基础(C# 6 模拟)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 3 节课。

「Span/ReadOnlySpan 基础(C# 6 模拟)」这节课中我会学到什么?

使用 ArraySegment 模拟 Span/ReadOnlySpan:创建数组视图,通过偏移量和长度切片,并在不复制的情况下处理数据。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「Span/ReadOnlySpan 基础(C# 6 模拟)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Span/ReadOnlySpan 基础(C# 6 模拟)
  2. Memory/ReadOnlyMemory 模拟:零复制窗口
  3. 字符串即 Span 的 API(C# 6 模拟)
← 返回 C# Academy