الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إضافة مناهج جديدة للفئات المعرفة مسبقا

بدأه عبد الرحمن أحمد في 24 ديسمبر 2012 · 1 رد · 367 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

وهذه الميزة تتيح تعريف مناهج جديدة لتضاف إلى فئات مبنية مسبقا وحتى تلك الفئات والأصناف القياسية مثل int و string و غيرها

الفكرة ببساطة هو إضافة صنف جديد عام ستاتيكي وفي المستوى الأعلى أي أن يكون ضمن نيم سبيس وليس ولد لصنف آخر

ولنعطه أي اسم وليكن MethodsExt

فيصبح لدينا التالي :

namespace MyMethodsExt
{

	public static class MethodsExt
	{
    	//هنا يتم وضع المناهج الموسعة
	}
}

الآن يمكنك تعريف أي مناهج داخل هذا الصنف

ولكن كيف سيفهم المترجم أنه يتبع فئة ما

كمثال أن أضيف منهج لنوع المعطيات int يقوم بحساب مكعب أي عدد

فبدلا من أن نضربه في كل مرة بنفسه ثلاث مرات أو أن نصنع له دالة ونمرر القيمة

يمكن تعريف دالة تصبح جزء من النوع int

فنعرفه داخل الصنف السابق كما يلي :

    	public static int Cubic(this int value)
    	{
        	return value * value * value;
    	}

والآن بإمكانك أن تستدعي هذه الدالة كجزء مبني ضمن النوع int

كمثال :

        	int a = 2;
        	var c = a.Cubic();
        	c = c.Cubic();

لاحظوا أننا بهذه الطريقة استغنينا عن استدعاء دالة وتمرير القيمة وأصبحت تظهر كدالة مسبقة عند إضافة نقطة بعد أي متحول من النوع int

السر في ما سبق هو this عند التصريح عن البارمتر للدالة والذي يجعل المترجم في زمن التصميم يترجمه على أنه معرف داخل الفئة المحددة

وهنا بالإمكان الاستفادة من هذه الميزة في عدة أشياء

كمثال أنا استخدمه كثيرا

وهو أننا غالبا نتحقق من المتحول أن لا يكون null قبل استخدامه و عادة سنتخدم تعليمة الشرط

        	MyClass1 myClass = null;

        	if (myClass == null)
        	{
        	}
        	else
        	{
        	}
//أو
        	if (myClass != null)
        	{
        	}

ولهذا بالإمكان إضافة المناهج الموسعة التالية

    	public static bool IsNull(this object value)
    	{
        	return value == null;
    	}

    	public static bool IsNotNull(this object value)
    	{
        	return value != null;
    	}

وقد حددنا النوع المستهدف على أنه النوع الجذر object لكي يتم الوصول إليه من جميع الفئات لأن جميعها ترث الصنف object و جميعها تقبل المقارنة مع القيمة null

الآن يمكن إعادة المثال السابق كما يلي :

        	MyClass1 myClass = null;

        	if (myClass.IsNull())
        	{
        	}
        	else
        	{
        	}

        	if (myClass.IsNotNull())
        	{
        	}

كما أنه يمكن استخدام مناهج بشكل مطور أكثر

كمثال :

قمت بتعريف دالة تقوم بإعادة قيمة ممرة إذا كان المتحول null

    	public static T IfNullReplace<T>(this T value, T AlterValue)
    	{
        	try
        	{
            	if (value == null)
                	return AlterValue;
            	else
                	return value;
        	}
        	catch (Exception ex)
        	{
            	throw ex;
        	}
    	}

وتم استخدام الرمز T لكي يتم تحديد النوع أثناء الاستدعاء

ولو فرضنا أنه لدينا الصنف التالي :

	class MyClass1
	{
    	public MyClass1(string newValue)
    	{
        	MyProperty = newValue;
    	}

    	public string MyProperty { get; set; }
	}

فيمكننا استخدام الدالة كما يلي :

        	MyClass1 myClass = null;

        	var someVar = myClass.IfNullReplace(new MyClass1("SomeText"));

وفي هذه الحالة إن كان المتحول null فسيعيد القيمة الممرة وإلا سيعيد نفس القيمة

وهذه نستفيد منها في حال نتعامل مع عمليات حسابية على فئات Nullable أي مثل int? أو DateTime? و التي تستخدم أثناء التعامل مع قواعد البيانات SQL

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

    	public static DateTime Reset(this DateTime value)
    	{
        	return new DateTime(2012, 1, 1, 12, 00, 00);
    	}

    	public static DateTime ResetDate(this DateTime value)
    	{
        	return new DateTime(2012, 1, 1);
    	}

    	public static DateTime ResetTime(this DateTime value)
    	{
        	return new DateTime(value.Year, value.Month, value.Day, 08, 30, 00);
    	}

ويمكن استدعاءها كما يلي :

        	DateTime d= new DateTime();
        	d = d.ResetTime();
        	d = d.ResetDate();
        	d = new DateTime();
        	d = d.Reset();

وهكذا نجد أنه بالإمكان أن تجعل من صنف المناهج الممتدة مكتبة لك تحوي كل المناهج التي تختصر الكود والوقت

كما بالإمكان أن يتم تبادل المكتبات من قبل المبرمجين ليتم تجميعها في مكتبة لتكون مصدرا لكل المبرمجين

ودمتم بخير

أخوكم أبو أحمد

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 24 ديسمبر 2012 في 15:08

2

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#2

بارك الله فيك أخانا الكريم وزادك الله من علمه

ونفعنا الله وإياكم بما علمنا

أدعو الله أن يجعل أعمالنا خالصة لوجهه الكريم --- وأن ينفعنا بما علمنا

Dr Sayed Tohamy

Programming Instructor

مدرب برمجة

---------------

EmaSoft2000

-------------------

مواضيع مشابهة