0Pricing
C# Academy · บทเรียน

พื้นฐาน Span/ReadOnlySpan (จำลองใน C# 6)

จำลอง Span/ReadOnlySpan ด้วย ArraySegment : สร้างมุมมองบนอาร์เรย์ แบ่งส่วนด้วยออฟเซ็ตและความยาว และประมวลผลข้อมูลโดยไม่ต้องคัดลอก

พื้นฐาน Span/ReadOnlySpan (จำลองใน C# 6) เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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
  }
}

ช่วงย่อยซ้อนกัน

คุณสามารถสร้างตัวช่วยแบ่งช่วงเพื่อเลือกช่วงย่อยจากส่วนที่มีอยู่ได้ โดยยังไม่เกิดการคัดลอก

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

เคล็ดลับและข้อจำกัด

เคล็ดลับ:

  • ออกแบบส่วนติดต่อการเขียนโปรแกรมให้รับ ArraySegment<T> เมื่อทำงานกับอาร์เรย์
  • ติดตาม ตำแหน่งเริ่มต้น และ จำนวน ให้ดี
  • คัดลอกเฉพาะที่ขอบเขต เช่น การรับส่งข้อมูลและการเชื่อมต่อระหว่างระบบ
  • ชนิดช่วงข้อมูลสมัยใหม่มีความปลอดภัยและมุมมองบนสแตก ส่วนในบทนี้ใช้เซกเมนต์เพื่อเรียนรู้แนวคิดการแบ่งช่วง

การจำลองช่วงย่อยใน C# 6

ตรวจสอบสั้น ๆ: ชนิดใดใน C# 6 ที่จำลองช่วงย่อยแบบไม่คัดลอก หรือมุมมองเหนือบางส่วนของอาร์เรย์ได้ดีที่สุด

สรุปทบทวน

สรุปทบทวน: ใช้ ArraySegment<T> เพื่อมองช่วงย่อย เขียนส่วนติดต่อการเขียนโปรแกรมที่รับเซกเมนต์ ดำเนินการผ่านตำแหน่งเริ่มต้น/จำนวน และคัดลอกเฉพาะเมื่อจำเป็น

คำถามที่พบบ่อย

บทเรียน “พื้นฐาน Span/ReadOnlySpan (จำลองใน C# 6)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐาน Span/ReadOnlySpan (จำลองใน C# 6)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน Span/ReadOnlySpan (จำลองใน C# 6)”

จำลอง Span/ReadOnlySpan ด้วย ArraySegment : สร้างมุมมองบนอาร์เรย์ แบ่งส่วนด้วยออฟเซ็ตและความยาว และประมวลผลข้อมูลโดยไม่ต้องคัดลอก คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 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