0Pricing
C# Academy · レッスン

Span/ReadOnlySpanの基礎(C# 6でのエミュレーション)

ArraySegment でSpan/ReadOnlySpanを再現します。配列のビューを作り、offset/lengthでスライスし、コピーせずにデータを処理します。

「Span/ReadOnlySpanの基礎(C# 6でのエミュレーション)」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。

スライスが重要な理由

目的: 追加のメモリ割り当てなしでスライスを扱います。

  • ビューとしてArraySegment<T>を使います
  • offsetとcountでスライスします
  • 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
  }
}

ビューによるインプレース操作

offset/countで操作して部分文字列の作成を避けます。これは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>を受け取るように設計します。
  • offsetとcountを常に把握します。
  • 境界(I/O、相互運用)でのみコピーします。
  • 最新のSpanは安全性とスタック上のビューを提供します。ここではスライスの考え方を学ぶためにセグメントを使います。

C# 6でのスライスの再現

確認問題: 配列の一部をコピーせずにビューとして扱うスライスを最もよく再現できるC# 6の型はどれですか?

振り返り

振り返り: ArraySegment<T>で部分範囲をビューとして扱い、セグメントを受け取るAPIを記述し、offset/countで操作し、必要な場合にのみコピーします。

よくある質問

「Span/ReadOnlySpanの基礎(C# 6でのエミュレーション)」レッスンは無料ですか?

はい。「Span/ReadOnlySpanの基礎(C# 6でのエミュレーション)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「Span/ReadOnlySpanの基礎(C# 6でのエミュレーション)」で何を学びますか?

ArraySegment でSpan/ReadOnlySpanを再現します。配列のビューを作り、offset/lengthでスライスし、コピーせずにデータを処理します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応の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に戻る