C# Academy · Lektion

Grundlæggende Span/ReadOnlySpan (C# 6-emulering)

Emulér Span/ReadOnlySpan med ArraySegment : opret visninger over arrays, opdel med offset/length, og behandl data uden kopiering.

Lektion 1 af 38 trin

Grundlæggende Span/ReadOnlySpan (C# 6-emulering) er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 1 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 3 lektioner i alt.

Hvorfor udsnit er vigtige

Mål: Arbejd med udsnit uden ekstra allokeringer.

  • Brug ArraySegment<T> som en visning
  • Lav udsnit ud fra forskydning og antal
  • Skriv metoder, der accepterer ArraySegment<T>
  • Hold operationerne enkle og sikre

Visning uden kopiering

ArraySegment<T> er en visning uden kopiering over en del af et array. Send den til metoder for at undgå kopier ved udskæring.

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
  }
}

Indlejrede udsnit

Du kan oprette hjælpefunktionen Slice for at tage et delinterval af et eksisterende segment. Det sker stadig uden kopiering.

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
  }
}

Arbejd direkte via visningen

Arbejd ud fra forskydning/antal for at undgå at oprette delstrenge; det svarer til trimning baseret på 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();
  }
}

Materialisering efter behov

Nogle gange har du brug for en rigtig kopi. Materialize segmentet til et nyt array, men først ved grænsen.

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

Tips og begrænsninger

Tips:

  • Udform API'er, så de accepterer ArraySegment<T>, når du arbejder med arrays.
  • Hold styr på forskydning og antal.
  • Kopiér kun ved grænserne (I/O, interoperabilitet).
  • Moderne Span giver sikkerhed og visninger på stakken; her bruger vi segmenter for at lære tankegangen bag udsnit.

Emulering af udsnit i C# 6

Hurtigt tjek: Hvilken type i C# 6 efterligner bedst et udsnit (en visning) over en del af et array uden kopiering?

Opsamling

Opsamling: Brug ArraySegment<T> til at vise delintervaller, skriv API'er, der accepterer segmenter, arbejd via forskydning og antal, og kopiér kun, når det er nødvendigt.

Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Grundlæggende Span/ReadOnlySpan (C# 6-emulering)” gratis?

Ja — hele teksten til “Grundlæggende Span/ReadOnlySpan (C# 6-emulering)” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Grundlæggende Span/ReadOnlySpan (C# 6-emulering)”?

Emulér Span/ReadOnlySpan med ArraySegment : opret visninger over arrays, opdel med offset/length, og behandl data uden kopiering. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 3.

Hvor lang tid tager lektionen “Grundlæggende Span/ReadOnlySpan (C# 6-emulering)”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende Span/ReadOnlySpan (C# 6-emulering)
  2. Emulering af Memory/ReadOnlyMemory: vinduer uden kopiering
  3. String-as-Span-API'er (C# 6-emulering)
← Tilbage til C# Academy