نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة C# 6
نمذج اتحاد مميّز في C# 6 باستخدام تعداد للوسوم وفئات صغيرة، وأنشئ أساليب مصنع، وعالج البدائل عبر switch مع رمي افتراضي.
نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة 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
مراجعة
مراجعة: نمذج المتغيرات باستخدام تعداد وسم، وأنشئ الحالات الصالحة عبر دوال المصنع، واجمع المعالجة في 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنماط is والأنماط العلائقية والمنطقية (محاكاة C# 6)
- تعبيرات switch والتحقق من الشمول باستخدام when (محاكاة C# 6)
- نمذجة المجال باستخدام الاتحادات المميّزة (السجلات) — محاكاة C# 6