أنماط النوع والخاصية
طابق البنية والأعضاء
أنماط النوع والخاصية درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
نمط النوع
يطابق نمط النوع المدخل عندما يكون مثيلًا لنوع معيّن. وعند كتابته على شكل اسم النوع فقط في أحد فروع switch، فإنه يختبر نوع القيمة وقت التشغيل.
يستبدل هذا سلاسل الفحص باستخدام is متبوعة بعمليات التحويل المعقدة بفحص نظيف في تعبير واحد، كما يضيّق النوع تلقائيًا.
object o = "hello";
string kind = o switch
{
int => "number",
string => "text",
_ => "unknown"
};
System.Console.WriteLine(kind);أنماط التصريح
يضيف نمط التصريح اسم متغير بعد النوع، مثل: string s. وعند تحقّق المطابقة، تُحوَّل قيمة المدخل وتُربط بذلك المتغير.
يمكنكم بعد ذلك استخدام المتغير ذي النوع المحدد في الجانب الأيمن من الفرع، والوصول إلى الأعضاء الخاصة بذلك النوع من دون تحويل إضافي.
object o = "coddy";
string result = o switch
{
string s => $"len {s.Length}",
int n => $"value {n}",
_ => "other"
};
System.Console.WriteLine(result);تبديل عملي حسب النوع
تُعد أنماط الأنواع مثالية لمعالجة البيانات غير المتجانسة، مثل تحليل القيم من مصفوفة object.
تُطابق هنا كل قيمة بحسب نوعها وقت التشغيل، ثم تُنسَّق وفقًا لذلك. ويحمل المتغير المربوط النوع الذي جرى تضييقه إلى تعبير النتيجة.
using System;
class Program {
static string Describe(object o) => o switch {
int i => $"int {i}",
double d => $"double {d}",
string s => $"string '{s}'",
_ => "?"
};
static void Main() {
foreach (var x in new object[]{ 1, 2.5, "hi" })
Console.WriteLine(Describe(x));
}
}نمط الخاصية
يفحص نمط الخاصية أعضاء كائن باستخدام الأقواس المعقوفة: { Property: value }. ويطابق الكائن عندما تحقق كل خاصية مدرجة نمطها المتداخل.
يتيح هذا التفرع بناء الكائن ومحتوياته مباشرة، من دون كتابة مقارنات يدوية للأعضاء.
record Person(string Name, int Age);
var p = new Person("Ada", 30);
string stage = p switch
{
{ Age: < 18 } => "minor",
{ Age: >= 65 } => "senior",
_ => "adult"
};
System.Console.WriteLine(stage);خصائص متعددة
يمكنكم اختبار عدة خصائص في آن واحد بفصلها بفواصل داخل الأقواس المعقوفة. ويجب أن تتحقق مطابقة جميعها حتى يُنفَّذ الفرع.
يعبّر هذا بوضوح عن الشروط المركبة، مثل مطابقة كائن له حالة وعدد محدد معًا.
record Order(string Status, int Items);
var order = new Order("Open", 0);
string msg = order switch
{
{ Status: "Open", Items: 0 } => "empty cart",
{ Status: "Open" } => "shopping",
_ => "closed"
};
System.Console.WriteLine(msg);دمج النوع والخاصية
يمكن دمج أنماط الأنواع والخصائص: اكتبوا النوع، ثم كتلة خصائص بين أقواس معقوفة. ولا يطابق الفرع إلا إذا كان المدخل من ذلك النوع وكانت خصائصه مطابقة.
يكون هذا قويًا عند التعامل مع مراجع الفئات الأساسية أو الواجهات، عندما تريدون التفرع بحسب الأنواع الفرعية الفعلية وحالتها معًا.
using System;
abstract record Shape;
record Circle(double R) : Shape;
record Square(double Side) : Shape;
class Program {
static string Big(Shape s) => s switch {
Circle { R: > 10 } => "big circle",
Square { Side: > 10 } => "big square",
_ => "small"
};
static void Main() => Console.WriteLine(Big(new Circle(12)));
}أنماط الخصائص المتداخلة
يمكن أن تتداخل أنماط الخصائص. فإذا كانت الخاصية كائنًا بحد ذاتها، يمكنكم مطابقة أعضائها باستخدام كتلة أخرى بين أقواس معقوفة.
فعلى سبيل المثال، يتعمق { Address: { City: "Paris" } } مستويين داخل تعبير واحد. وهذا يتجنب سلاسل الوصول المنقوطة المعرّضة لمشكلات null.
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Paris"));
bool inParis = u is { Address: { City: "Paris" } };
System.Console.WriteLine(inParis);الوصول الممتد إلى الخصائص
منذ C# 10، يمكنكم استخدام مسار منقوط داخل نمط خاصية: { Address.City: "Paris" }. وهذا اختصار للأقواس المعقوفة المتداخلة.
يُبسّط هذا الفحوص العميقة في سطر واحد مقروء، مع الاستمرار في التعامل بأمان مع القيم الوسيطة أثناء المطابقة.
record Address(string City);
record User(string Name, Address Address);
var u = new User("Lin", new Address("Rome"));
string where = u switch
{
{ Address.City: "Paris" } => "FR",
{ Address.City: "Rome" } => "IT",
_ => "??"
};
System.Console.WriteLine(where);التقاط المطابقة بأكملها
يمكنكم ربط متغير بالقيمة المطابقة بأكملها بإضافة اسم بعد نمط الخاصية: { Age: > 18 } adult.
يشير المتغير adult بعد ذلك إلى الكائن الكامل داخل الفرع، ما يتيح لكم استخدامه بعد التأكد من اجتياز خصائصه للاختبار.
using System;
record Person(string Name, int Age);
class Program {
static void Main() {
Person p = new("Sam", 40);
string r = p switch {
{ Age: >= 18 } adult => $"{adult.Name} can vote",
_ => "too young"
};
Console.WriteLine(r);
}
}التعامل مع null
لا يطابق نمط الخاصية أبدًا القيمة null، إذ لا يوجد كائن لفحصه. لذلك تطابق { }، أي الأقواس المعقوفة الفارغة، أي قيمة غير فارغة.
يجعل هذا من not null و{ } اصطلاحين مفيدين لفحوص null، ويضمن تجاوز الفروع المعتمدة على الخصائص للمدخلات الفارغة بأمان.
string? maybe = null;
string state = maybe switch
{
null => "missing",
{ Length: 0 } => "empty",
_ => "has text"
};
System.Console.WriteLine(state);لماذا تتفوق الأنماط على عمليات التحويل
قبل ظهور الأنماط، كان التفرع المستند إلى النوع يعني إجراء فحوص is تتبعها عمليات تحويل وفحوص للقيم الفارغة. وتجمع أنماط الأنواع والخصائص كل ذلك في تعبير واحد.
كما يتتبع المصرّف اكتمال الحالات وإمكانية الوصول، فيكتشف الفروع الميتة والحالات المفقودة التي كانت سلاسل if المكتوبة يدويًا تتجاهلها بصمت.
object o = 42;
// Old: if (o is int) { int n = (int)o; ... }
// New:
if (o is int n) System.Console.WriteLine(n + 1);اختبار سريع
اختبروا مدى فهمكم لأنماط الأنواع والخصائص.
مراجعة
تطابق أنماط الأنواع وفق النوع وقت التشغيل، ويمكنها ربط متغير ذي نوع محدد. وتفحص أنماط الخصائص الأعضاء باستخدام { Prop: pattern }، وتدعم التداخل والمسارات المنقوطة، ولا تطابق null أبدًا.
ادمجوا بينها للتفرع بحسب البنية والحالة معًا. وسنتناول بعد ذلك الأنماط العلاقية والمنطقية.
الأسئلة الشائعة
هل درس «أنماط النوع والخاصية» مجاني؟
نعم — نص درس «أنماط النوع والخاصية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط النوع والخاصية»؟
طابق البنية والأعضاء تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «أنماط النوع والخاصية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعبيرات switch
- أنماط النوع والخاصية
- الأنماط العلاقية والمنطقية
- أنماط القوائم وTuples