تلميح | المنهج المُضاف Extension Method له ميزة ليست موجودة في المنهج المُضمن Embedded Method

السلام عليكم ورحمة الله وبركاته

بسم الله الرحمن الرحيم

نحن نعلم أن المناهج Method هي أحد أنواع الأعضاء التي يمكن تعريفها ضمن الفئات Class

public class MyClass
{
    public void MyMethod()
    {

    }
}

ويتم الوصول إليها من خلال الكائن المُنشأ من هذه الفئة ثم نقطة التبعية ثم اسم المنهج

        MyClass MyInstance = new MyClass();
        MyInstance.MyMethod();

ثم أضيفت ميزة للغة سي شارب وهي المناهجة المُضافة/الموسعة/الملحقة - ترجمها ما شئت Extension Methods وهي تعريف منهج خارج الفئة وإلحاقه بالفئة بحيث يبدو وكأنه تابع له وذلك من خلال كتابته داخل فئة ستاتيكية و جعله هو ستاتيكي أيضا أي المنهج الجديد المُضاف مع تصريح أول بارمتر مسبوق بكلمة this ثم نوع الفئة التي نريد إلحاق المنهج بها

public static class ExtensionMethods
{

    public static void MyExtensionMethod(this MyClass obj)
    {
        if(obj != null)
        {
            obj.MyMethod();
        }
        else
        {
            // Do something
        }
    }

}

الآن أصبح بإمكاننا أن نستدعي المنهج الموسع كما يلي : MyClass MyInstance = new MyClass(); MyInstance.MyExtensionMethod(); والأن ما هي فائدة وميزات المناهج المضافة ؟ - أهم فائدة هي إلحاق مناهج بفئات مغلقة أي ضمن مكتبات ثنائية Binary و لا يتوفر لدينا الكود المصدري وبهذا أصبح بالإمكان تعريف أي مناهج مضافة لفئات قياسية مثل string أو DateTime أو أي نوع كان بحيث عندما يكون لدينا كائن من نوع تم توسعته مباشرة ستظهر كل المناهج المضافة ليتم استدعاءها وهذا سيختصر علينا أكواد فبدلا من تعريف منهج عام ثم تمرير الكائن وإجراء عمليات عليه ثم العودة بنتيجة بإمكاننا أن نعرفه كمنحج مضاف بحيث يمكن استدعاؤه من القيمة مباشرة وإجراء المطلوب وكمثال :

    public static bool IsNegative(this int number)
    {
        return number < 0;
    }

و أصبح بإمكاننا فحص أي رقم كما يلي:

        int num = new Random().Next();

        if(num.IsNegative())
            Console.WriteLine(string.Format("The number is Negative : {0}" , num));
        else
            Console.WriteLine(string.Format("The number is Positive : {0}" , num));
  • الميزة الأخرى والتي نوهت أنها غير متوفرة في المناهج الأصلية ضمن الفئات هي معالجة الاستدعاء بالنسبة لكائن غير موجود أي null فلو استدعينا

        MyInstance.MyMethod();
    

وكان MyInstance قيمته null سيتولد استثناء NullReferenceException

أما في حالة المنهج المضاف نلاحظ أنه يتم تمرير الكائن إلى داخل المنهج بحيث يسمح لك بفحصه أولا واتخاذ المناسب دون الوصول إلى الخطأ

وقد بينت ذلك أعلاه في جسم المنهج المضاف

ودمتم بخير

عبد الرحمن أحمد

02-03-2014