Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دوال التوسعة (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 قوية لإضافة دوال مساعدة إلى الأنواع التي لا تتحكم فيها، مع الحفاظ على نظافة التعليمات البرمجية ووضوحها.

challenge icon

التحدي

سهل

لننشئ مجموعة من methods المفيدة للامتدادات الخاصة بالأعداد الصحيحة، والتي تضيف وظائف ملائمة تتوقع وجودها مضمّنة. ستنشئ class ثابتة تحتوي على methods للامتداد يمكن استدعاؤها مباشرةً على أي عدد صحيح، مما يجعل كودك أكثر تعبيرًا وأسهل قراءة.

ستنظّم كودك عبر ملفين:

  • IntExtensions.cs: أنشئ class ثابتة تُسمّى IntExtensions في namespace Utilities. ستحتوي هذه class على methods للامتداد تعزّز النوع int:
    • IsEven() - تُعيد true إذا كان number زوجيًا، وfalse خلاف ذلك
    • Square() - تُعيد number مضروبًا في itself
    • IsInRange(int min, int max) - تُعيد true إذا كان number بين min وmax (بشكل inclusive)، وfalse خلاف ذلك
    تذكّر أن methods الامتداد يجب أن تكون methods ثابتة في class ثابتة، مع استخدام الكلمة المفتاحية this في first parameter لتحديد النوع الذي تعمل على تمديده.
  • 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}

    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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

تدرّب بنفسك: مترجم C# عبر الإنترنت