الخميس، 26 فبراير 2009

المناهج الإضافية Extension Methods

  1. نظرة عامة على بعض ميزات C# 3.5 الجديدة - 1
  2. المناهج الإضافية Extension Methods


    المناهج الإضافية هي مناهج ساكنة Static Methods يتم تنفيذها باستخدام صيغة تنفيذ المناهج العادية instance methods. وتفيد المناهج الإضافية بتوسعة الأنواع الموجودة والأنواع الجديدة التي يكتبها المبرمج وبمناهج إضافية جديدة.

    التصريح عن المناهج الإضافية Declaring Extension Methods
    يتم التصريح عن المناهج الإضافية بتحديد الكلمة المحجوزة this كمحدد لأول وسيط parameter من وسطاء المنهج. ويمكن التصريح عن المناهج الإضافية في الصفوف الساكنة الغير عامة والغير متداخلة مع صفوف أخرى non-generic and non-nested and static classes.


namespace Acme.Utilities
{
public static class Extensions
{
public static int ToInt32(this string s)
{
return Int32.Parse(s);
}

public static T[] Slice(this T[] source, int index, int count)
{
T[] result = new T[count];
Array.Copy(source, index, result, 0, count);
return result;
}
}
}



مجال رؤية المناهج الإضافية Available Extension Methods
تتوفر المناهج الإضافية في فضاء الأسماء namespace في حال تم تعريف هذه المناهج في صف ساكن أو تم استيرادها باستخدام using-namespace-directives, بالإضافة إلى استيراد الأنواع باستخدام using-namespace-directives فإنه يتم استيراد جميع المناهج الإضافية الموجودة في الصفوف الساكنة المعرفة في فضاء الأسماء المحدد.


تتوفر المناهج الإضافية كمناهج جديدة على الأنواع ولكن بأسبقية أقل من مناهج الأنواع الأصلية, على سبيل المثال عند استيراد فضاء الأسماء Acme.Utilities من المثال السابق كما يلي:


using Acme.Utilities;


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


string s = "1234";
int i = s.ToInt32(); // Same as Extensions.ToInt32(s)
int[] digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] a = digits.Slice(4, 3); // Same as Extensions.Slice(digits, 4, 3)



تنفيذ المناهج الإضافية Extension Methods Invocations
للمناهج العادية التابعة للأنواع الأفضلية على المناهج الإضافية, والمناهج الإضافية المصرح عنها في فضاءات الأسماء الداخلية لها الأفضلية على المناهج الإضافية المصرح عنها في فضاءات الأسماء الخارجية, مثال:

public static class E
{
public static void F(this object obj, int i) { }
public static void F(this object obj, string s) { }
}
class A { }
class B
{
public void F(int i) { }
}
class C
{
public void F(object obj) { }
}
class X
{
static void Test(A a, B b, C c)
{
a.F(1); // E.F(object, int)
a.F("hello"); // E.F(object, string)
b.F(1); // B.F(int)
b.F("hello"); // E.F(object, string)
c.F(1); // C.F(object)
c.F("hello"); // C.F(object)
}
}



في المثال السابق المنهج العادي المصرح عنه في الصف B له الأسبقية على المنهج الإضافي F الأول المصرح عنه في الصف E, والمنهج العادي المصرح عنه في الصف C له الأسبقية على المنهجين الإضافيين المصرح عنهما في الصف E.

مترجم بتصرف عن مقالة من موقع http://www.micrsoft.com

ليست هناك تعليقات:

إرسال تعليق