0Pricing
C# Academy · درس

أساسيات Span/ReadOnlySpan (محاكاة C# 6)

حاكِ Span/ReadOnlySpan باستخدام ArraySegment : أنشئ عروضًا على المصفوفات، واقطعها باستخدام offset/length، وعالج البيانات دون نسخ.

أساسيات Span/ReadOnlySpan (محاكاة C# 6) درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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();
  }
}

الإنشاء الفعلي عند الطلب

تحتاج أحيانًا إلى نسخة حقيقية. استخدم 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> عند العمل على المصفوفات.
  • تتبّع offset وcount.
  • انسخ فقط عند الحدود (الإدخال والإخراج أو الربط البيني).
  • يوفّر Span الحديث أمانًا وعروضًا على المكدس؛ نستخدم هنا المقاطع لتعلّم أسلوب التفكير القائم على التقسيم.

محاكاة المقاطع في C# 6

تحقّق سريع: ما نوع C# 6 الذي يحاكي على أفضل نحو مقطعًا غير ناسخ (عرضًا) فوق جزء من مصفوفة؟

مراجعة

مراجعة: استخدم ArraySegment<T> لعرض النطاقات الفرعية، واكتب واجهات برمجة تطبيقات تقبل المقاطع، واعمل عبر offset/count، وانسخ فقط عند الضرورة.

الأسئلة الشائعة

هل درس «أساسيات Span/ReadOnlySpan (محاكاة C# 6)» مجاني؟

نعم — نص درس «أساسيات Span/ReadOnlySpan (محاكاة C# 6)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «أساسيات Span/ReadOnlySpan (محاكاة C# 6)»؟

حاكِ Span/ReadOnlySpan باستخدام ArraySegment : أنشئ عروضًا على المصفوفات، واقطعها باستخدام offset/length، وعالج البيانات دون نسخ. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.

كم من الوقت يستغرق درس «أساسيات Span/ReadOnlySpan (محاكاة C# 6)»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساسيات Span/ReadOnlySpan (محاكاة C# 6)
  2. محاكاة Memory/ReadOnlyMemory: نوافذ دون نسخ
  3. واجهات String-as-Span (محاكاة C# 6)
← العودة إلى C# Academy