C# Academy · درس

نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة C# 6

نمذج اتحاد مميّز في C# 6 باستخدام تعداد للوسوم وفئات صغيرة، وأنشئ أساليب مصنع، وعالج البدائل عبر switch مع رمي افتراضي.

الدرس 3 من 38 خطوة

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

فكرة DU في C# 6

الهدف: أنشئ اتحادًا مميَّزًا صغيرًا في C# 6.

  • تعداد وسم للحالة النشطة
  • أصناف الحالات الصغيرة للبيانات
  • أساليب مصنع لإنشاء حالات صالحة
  • Switch + default throw لمعالجة جميع المتغيرات

الوسم + دوال المصنع

استخدم تعداد وسم ودوال مصنع لإنشاء الحالات الصالحة فقط؛ وتبقى الحقول الخاصة بالحالات الأخرى غير مستخدمة.

using System;

public enum PaymentKind { Cash, Card, Wire }

public sealed class Payment
{
  public PaymentKind Kind;

  // per-case data (only one is meaningful per instance)
  public string CardLast4; // for Card
  public string Iban;      // for Wire

  private Payment() { }

  // factories keep invariants
  public static Payment Cash()
  {
    Payment p = new Payment();
    p.Kind = PaymentKind.Cash;
    return p;
  }

  public static Payment Card(string last4)
  {
    if (string.IsNullOrEmpty(last4) || last4.Length != 4)
      throw new ArgumentException("last4 must be 4 digits", "last4");
    Payment p = new Payment();
    p.Kind = PaymentKind.Card;
    p.CardLast4 = last4;
    return p;
  }

  public static Payment Wire(string iban)
  {
    if (string.IsNullOrEmpty(iban))
      throw new ArgumentException("iban must not be empty", "iban");
    Payment p = new Payment();
    p.Kind = PaymentKind.Wire;
    p.Iban = iban;
    return p;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Payment a = Payment.Cash();
    Payment b = Payment.Card("1234");
    Payment c = Payment.Wire("TR00BANKIBAN");
    Console.WriteLine(a.Kind + ", " + b.Kind + ", " + c.Kind);
  }
}

معالجة المتغيرات

يوفّر استخدام switch التقليدي على الوسم معالجة واضحة. ويكشف default throw المتغيرات غير المعالجة أثناء الاختبارات.

using System;

public enum PaymentKind { Cash, Card, Wire }

public sealed class Payment
{
  public PaymentKind Kind;
  public string CardLast4;
  public string Iban;

  public static Payment Cash()
  {
    Payment p = new Payment(); p.Kind = PaymentKind.Cash; return p;
  }
  public static Payment Card(string last4)
  {
    if (string.IsNullOrEmpty(last4) || last4.Length != 4) throw new ArgumentException("last4");
    Payment p = new Payment(); p.Kind = PaymentKind.Card; p.CardLast4 = last4; return p;
  }
  public static Payment Wire(string iban)
  {
    if (string.IsNullOrEmpty(iban)) throw new ArgumentException("iban");
    Payment p = new Payment(); p.Kind = PaymentKind.Wire; p.Iban = iban; return p;
  }
}

public static class Exhaustive
{
  public static Exception Unhandled(object x)
  {
    return new InvalidOperationException("Unhandled case: " + x);
  }
}

public class Program
{
  static string Describe(Payment p)
  {
    switch (p.Kind)
    {
      case PaymentKind.Cash: return "Cash";
      case PaymentKind.Card: return "Card ****" + p.CardLast4;
      case PaymentKind.Wire: return "Wire " + p.Iban;
      default: throw Exhaustive.Unhandled(p.Kind);
    }
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(Describe(Payment.Card("9876")));
  }
}

المساعد Match (شبيه بالزائر)

يجمع مساعد Match صغير عملية switch في مكان واحد ويعيد قيمة، مما يحافظ على نظافة مواضع الاستدعاء.

using System;

public enum PaymentKind { Cash, Card, Wire }

public sealed class Payment
{
  public PaymentKind Kind;
  public string CardLast4;
  public string Iban;

  public static Payment Cash() { Payment p = new Payment(); p.Kind = PaymentKind.Cash; return p; }
  public static Payment Card(string last4) { Payment p = new Payment(); p.Kind = PaymentKind.Card; p.CardLast4 = last4; return p; }
  public static Payment Wire(string iban) { Payment p = new Payment(); p.Kind = PaymentKind.Wire; p.Iban = iban; return p; }
}

public static class PaymentMatch
{
  public static T Match<T>(
    Payment p,
    Func<T> onCash,
    Func<string, T> onCard,
    Func<string, T> onWire)
  {
    switch (p.Kind)
    {
      case PaymentKind.Cash: return onCash();
      case PaymentKind.Card: return onCard(p.CardLast4);
      case PaymentKind.Wire: return onWire(p.Iban);
      default: throw new InvalidOperationException("Unhandled: " + p.Kind);
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Payment p = Payment.Card("1234");
    string summary = PaymentMatch.Match(
      p,
      delegate { return "Cash"; },
      delegate(string last4) { return "Card ****" + last4; },
      delegate(string iban) { return "Wire " + iban; }
    );
    Console.WriteLine(summary);
  }
}

الثوابت عبر دوال المصنع

تفرض دوال المصنع الشروط الثابتة: تهيّئ كل حالة الحقول ذات الصلة بها فقط، وترفض المدخلات غير الصالحة مبكرًا.

using System;

public enum ResultKind { Ok, Error }

public sealed class Result
{
  public ResultKind Kind;
  public string Message; // only for Error
  public int Value;      // only for Ok

  private Result() { }

  public static Result Ok(int value)
  {
    Result r = new Result();
    r.Kind = ResultKind.Ok;
    r.Value = value;
    r.Message = null;
    return r;
  }

  public static Result Error(string message)
  {
    if (string.IsNullOrEmpty(message)) throw new ArgumentException("message");
    Result r = new Result();
    r.Kind = ResultKind.Error;
    r.Message = message;
    r.Value = 0;
    return r;
  }
}

public class Program
{
  static string Show(Result r)
  {
    switch (r.Kind)
    {
      case ResultKind.Ok: return "OK: " + r.Value;
      case ResultKind.Error: return "ERROR: " + r.Message;
      default: throw new InvalidOperationException("Unhandled: " + r.Kind);
    }
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(Show(Result.Ok(5)));
    Console.WriteLine(Show(Result.Error("Boom")));
  }
}

نصائح ومفاضلات

نصائح:

  • فضّل الحالات الصغيرة المركّزة ودوال المصنع.
  • عالج المتغيرات في مكان واحد (مساعد switch) لإبقاء الشيفرة جافة.
  • أبقِ default throw لكشف الحالات المفقودة في الاختبارات.

المفاضلات: يتطلب ذلك شيفرة هيكلية أكثر من السجلات الحديثة، لكنه واضح ومتوافق مع C# 6.

نهج محاكاة DU

تحقّق سريع: في C# 6، ما الطريقة البسيطة لمحاكاة اتحاد مميَّز؟

مراجعة

مراجعة: نمذج المتغيرات باستخدام تعداد وسم، وأنشئ الحالات الصالحة عبر دوال المصنع، واجمع المعالجة في switch (يرمي default استثناءً) لتحقيق الشمولية وقت التشغيل.

البدء مجانًا

تعلم C# مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
93
الدروس
346

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

هل درس «نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة C# 6» مجاني؟

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

ماذا ستتعلم في «نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة C# 6»؟

نمذج اتحاد مميّز في C# 6 باستخدام تعداد للوسوم وفئات صغيرة، وأنشئ أساليب مصنع، وعالج البدائل عبر switch مع رمي افتراضي. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة C# 6»؟

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

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

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

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

  1. أنماط is والأنماط العلائقية والمنطقية (محاكاة C# 6)
  2. تعبيرات switch والتحقق من الشمول باستخدام when (محاكاة C# 6)
  3. نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة C# 6
← العودة إلى C# Academy