دوال التوسعة (Extension Methods)
جزء من قسم البرمجة كائنية التوجه في رحلة C# على Coddy. الدرس 39 من 70.
تتيح لك أساليب الامتداد إضافة أساليب جديدة إلى الأنواع الموجودة دون تعديل شفرتها المصدرية أو إنشاء فئات مشتقة. وتظهر كما لو كانت أساليب أصلية للنوع، مما يجعل شفرتك أكثر قابلية للقراءة وبديهية.
لإنشاء extension method، عرّف static method داخل static class، مع وضع الكلمة المفتاحية this قبل first parameter:
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}يمكنك الآن استدعاء هذه الطريقة مباشرةً على أي سلسلة نصية:
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3تُخبر معلمة this string str المترجمَ بأن هذا method يوسّع النوع string. وعندما تستدعي sentence.WordCount()، يترجمها المترجم إلى StringExtensions.WordCount(sentence) من وراء الكواليس.
يمكن لأساليب الامتداد أيضًا قبول معاملات إضافية:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
// الاستخدام
bool result = "Hello".IsLongerThan(3); // trueتُستخدم هذه التقنية على نطاق واسع في LINQ، حيث إن methods مثل Where() وSelect() هي extension methods على IEnumerable. تُعد extension methods قوية لإضافة دوال مساعدة إلى الأنواع التي لا تتحكم فيها، مع الحفاظ على نظافة التعليمات البرمجية ووضوحها.
التحدي
سهللننشئ مجموعة من methods المفيدة للامتدادات الخاصة بالأعداد الصحيحة، والتي تضيف وظائف ملائمة تتوقع وجودها مضمّنة. ستنشئ class ثابتة تحتوي على methods للامتداد يمكن استدعاؤها مباشرةً على أي عدد صحيح، مما يجعل كودك أكثر تعبيرًا وأسهل قراءة.
ستنظّم كودك عبر ملفين:
IntExtensions.cs: أنشئclassثابتة تُسمّىIntExtensionsفيnamespaceUtilities. ستحتوي هذهclassعلىmethodsللامتداد تعزّز النوعint:IsEven()- تُعيدtrueإذا كانnumberزوجيًا، وfalseخلاف ذلكSquare()- تُعيدnumberمضروبًا فيitselfIsInRange(int min, int max)- تُعيدtrueإذا كانnumberبينminوmax(بشكلinclusive)، وfalseخلاف ذلك
methodsالامتداد يجب أن تكونmethodsثابتة فيclassثابتة، مع استخدام الكلمة المفتاحيةthisفيfirstparameterلتحديد النوع الذي تعمل على تمديده.Program.cs: في ملفك الرئيسي، اقرأ عددًا صحيحًا منinputsواعرضmethodsالامتداد الثلاثة. استدعِ كلmethodمباشرةً على العدد الصحيح كما لو كانتmethodمضمّنة، ثم اطبعresults.
ستتلقى ثلاثة inputs:
numberلاختباره (عدد صحيح)- قيمة
minلفحصrange(عدد صحيح) - قيمة
maxلفحصrange(عدد صحيح)
اطبع الناتج بهذا التنسيق:
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}على سبيل المثال، إذا كانت inputs هي 7 و5 و10، فيجب أن يكون الناتج:
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? Trueلاحظ مدى طبيعية كتابة number.IsEven() وnumber.Square() - إذ تبدو methods الامتداد وكأنها كانت دائمًا جزءًا من نوع العدد الصحيح!
جرّب بنفسك
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// اقرأ المدخلات
int number = Convert.ToInt32(Console.ReadLine());
int min = Convert.ToInt32(Console.ReadLine());
int max = Convert.ToInt32(Console.ReadLine());
// TODO: استخدم دوال التوسيع على 'number' واطبع النتائج
// استدعِ number.IsEven() و number.Square() و number.IsInRange(min, max)
// اطبع بالتنسيق:
// هل {number} زوجي؟ {True/False}
// مربع {number}: {result}
// هل {number} في النطاق [{min}-{max}]؟ {True/False}
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةNamespaces والتوجيهاتمقدمة في Classes و Objectsالكلمة المفتاحية 'this'Methods والمعاملاتFields مقابل PropertiesConstructorsObject Initializersمراجعة - آلة حاسبة بسيطة4الوراثة
صيغة الوراثة الأساسية (:)الكلمة المفتاحية 'base'الكلمات المفتاحية Virtual و Overrideالأصناف المختومة (Sealed Classes)الفئة الأساسية 'object'مراجعة - هيكلية الموظفين7ميزات متقدمة
تحميل العوامل (Operator Overloading)المفهرسات (Indexers (this[]))إعادة تعريف ()ToStringدوال التوسعة (Extension Methods)ملخص - Custom List2الخصائص والأعضاء الساكنة (Static Members)
الخصائص المطبقة تلقائيًا (Auto-Implemented Properties)خصائص القراءة فقط والكتابة فقطالحقول والدوال الساكنة (Static)الفئات الساكنة (Static Classes)الأعضاء ذات البنية التعبيرية (Expression-Bodied Members)5تعدد الأشكال والواجهات (Polymorphism & Interfaces)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالواجهة مقابل الفئة المجردة (Abstract Class)الواجهات المتعددةالواجهات الصريحةUpcasting و Downcastingملخص - حاسبة الأشكال8مفاهيم البرمجة كائنية التوجه (OOP) المتقدمة
التركيب بدلاً من الوراثةالـ Generics (الأصناف والدوال)الـ Delegates والأحداثالـ Attributes والـ Reflectionواجهة IDisposable وجملة usingأساسيات Dependency Injectionتدرّب بنفسك: مترجم C# عبر الإنترنت