قيود where
قيّد معاملات النوع
قيود where درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
سبب وجود القيود
تُعامل معلمة النوع T افتراضيًا تقريبًا مثل object، لذلك لا يسمح المترجم إلا بعدد قليل جدًا من العمليات عليها. وتخبر القيود، المكتوبة باستخدام where، المترجم بمزيد من المعلومات عن T.
وبفضل هذه المعرفة، يمكنكم استدعاء الأساليب أو إنشاء المثيلات أو مقارنة القيم بأمان.
void Show<T>(T value) where T : IFormattable
{
// now ToString(format, provider) is available
}قيود الواجهات
يفرض قيد الواجهة أن يطبق T واجهةً معينة. ويمكن لجسم الشيفرة عندئذٍ استدعاء أعضاء تلك الواجهة.
تضمن where T : IComparable<T> أدناه وجود أسلوب CompareTo.
T Max<T>(T a, T b) where T : IComparable<T>
=> a.CompareTo(b) >= 0 ? a : b;قيود الفئة الأساسية
يمكنكم اشتراط اشتقاق T من فئة أساسية محددة. وبعد ذلك يمكن استخدام أعضاء ذلك النوع الأساسي داخل الشيفرة العامة.
يشيع ذلك في أطر العمل التي تشترك جميع كياناتها في نوع أساسي.
class Animal { public string Name = ""; }
string NameOf<T>(T a) where T : Animal => a.Name;قيد class
يفرض where T : class أن يكون T نوعًا مرجعيًا. ويسمح ذلك بإسناد null والتحقق من مساواة المراجع.
يُستخدم هذا عادةً في المستودعات وذاكرات التخزين المؤقت وكل ما يخزن مراجع يمكن أن تكون null.
T? FindOrNull<T>(bool found, T value) where T : class
=> found ? value : null;قيد struct
يفرض where T : struct أن يكون T نوع قيمة غير قابل لـ null. ويتيح ذلك التعامل مع T بوصفه نوع قيمة واستخدام T? بوصفه نوع قيمة قابلًا لـ null.
يُستخدم هذا في الأدوات المساعدة التي تعمل فقط مع الأعداد أو التعدادات أو البُنى الصغيرة.
T? AsNullable<T>(T value) where T : struct
=> value;قيد new()
يفرض قيد new() أن يحتوي T على مُنشئ عام بلا معلمات. ويمكن لجسم الشيفرة عندئذٍ كتابة new T().
تعتمد المصانع ومجمّعات الكائنات على ذلك لإنشاء المثيلات بطريقة عامة.
using System;
class Program
{
static T Make<T>() where T : new() => new T();
static void Main()
{
var list = Make<System.Collections.Generic.List<int>>();
Console.WriteLine(list.Count);
}
}دمج القيود
يمكنكم تطبيق عدة قيود على معلمة واحدة. وتتطلب قواعد الترتيب وضع class أو struct أولًا، ثم الفئة الأساسية، ثم الواجهات، ثم new() أخيرًا.
تُدرج القيود بعد عبارة where واحدة، وتفصل بينها فواصل.
T Build<T>() where T : class, IComparable<T>, new()
=> new T();عبارات where متعددة
عندما يحتوي الأسلوب أو الفئة على عدة معلمات أنواع، تحصل كل معلمة على عبارة where خاصة بها. وتُكتب العبارات الواحدة تلو الأخرى.
يحافظ ذلك على فصل قيود كل معلمة بوضوح.
TResult Convert<TInput, TResult>(TInput x)
where TInput : class
where TResult : new()
=> new TResult();مثال عملي على القيود
يستخدم هذا البرنامج الكامل قيد IComparable<T> للعثور على القيمة الأكبر من قيمتين، ويعمل مع الأعداد الصحيحة والسلاسل النصية.
القيد هو ما يجعل استخدام CompareTo مسموحًا داخل الأسلوب.
using System;
class Program
{
static T Max<T>(T a, T b) where T : IComparable<T>
=> a.CompareTo(b) >= 0 ? a : b;
static void Main()
{
Console.WriteLine(Max(3, 9));
Console.WriteLine(Max("apple", "pear"));
}
}قيود notnull وunmanaged
يضيف C# الأحدث مزيدًا من القيود. إذ يمنع where T : notnull الأنواع القابلة لـ null، وهو مفيد لمفاتيح القواميس. بينما يقصر where T : unmanaged قيمة T على أنواع القيم القابلة للنقل مباشرةً (blittable) في الشيفرة منخفضة المستوى.
تعزز هذه القيود الأمان في السيناريوهات المتخصصة.
void Use<T>(T key) where T : notnull { }
unsafe void Raw<T>(T v) where T : unmanaged { }القيود تمكّن الإمكانات ولا تقيّدها
رغم أنها تبدو كقيود، فإنها تتيح الإمكانات فعليًا. فمن دون قيد لا يمكنكم الوصول تقريبًا إلى T، أما مع وجوده فتكتسبون أعضاءه.
اختاروا أقل قيد يتيح عمل خوارزميتكم، مع إبقاء معلمة النوع مرنة قدر الإمكان.
// No constraint: only object members available
string Name<T>(T x) => x.ToString();تحقق سريع
اختبروا مدى فهمكم لقيود where.
مراجعة
تقيّد عبارة where معلمات الأنواع باستخدام قيود الواجهة والفئة الأساسية وclass وstruct وnew() وnotnull وunmanaged. ويفتح كل قيد عمليات محددة على T.
رتبوا القيود ترتيبًا صحيحًا، واستخدموا عبارة واحدة لكل معلمة، واختاروا أقل قيد تحتاج إليه خوارزميتكم.
الأسئلة الشائعة
هل درس «قيود where» مجاني؟
نعم — نص درس «قيود where» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «قيود where»؟
قيّد معاملات النوع تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «قيود where»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.