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でのスライスの再現
振り返り
振り返り: 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Span/ReadOnlySpanの基礎(C# 6でのエミュレーション)
- Memory/ReadOnlyMemoryのエミュレーション:ゼロコピーのウィンドウ
- 文字列をSpanとして扱うAPI(C# 6でのエミュレーション)