C# Programming

إتقان تمرير الطرق في C#

Spread the love

يُمكنك C# من تمرير الدوال كمعاملات إلى الدوال الأخرى، مما يعزز مرونة وإعادة استخدام الكود بشكل كبير. هذه القدرة أساسية لتنفيذ عمليات الرد المُستدعى (callbacks)، ومعالجات الأحداث، والأنماط الاستراتيجية حيث يحدد سلوك وقت التشغيل الإجراء المحدد. تستعرض هذه المقالة أساليب متنوعة لتحقيق ذلك، مع التركيز على مندوبي المستخدم المُخصصين، و Func<>، و Action<>.

محتويات الجدول

استخدام مندوبي المستخدم المُخصصين لتمرير الدوال كمعاملات

يُمثل المندوب في C# مُشيرًا للدوال آمنًا من حيث النوع. إن إنشاء مندوب مُخصص يوفر تحكمًا دقيقًا ووضوحًا عندما يختلف توقيع الدالة عن مندوبي Func<> أو Action<> المُدمجين. لنعتبر دالة تقوم بعملية حسابية على رقم ثم تعرض النتيجة، حيث العملية الحسابية نفسها هي معامل.


// تعريف مندوب مُخصص
public delegate double MathOperation(double x);

public class Example
{
    public static void PerformOperationAndPrint(double num, MathOperation operation)
    {
        double result = operation(num);
        Console.WriteLine($"النتيجة: {result}");
    }

    public static double Square(double x) => x * x;
    public static double Cube(double x) => x * x * x;

    public static void Main(string[] args)
    {
        PerformOperationAndPrint(5, Square); // الناتج: النتيجة: 25
        PerformOperationAndPrint(5, Cube);  // الناتج: النتيجة: 125
    }
}

يُمثل MathOperation مندوبًا يمثل دالة تقبل قيمة من نوع double وتُعيد قيمة من نوع double. يقبل PerformOperationAndPrint هذا المندوب، مما يُمكن استخدام Square، Cube، أو أي دالة مُطابقة.

الاستفادة من مندوب Func<>

Func<> هو مندوب عام يُمثل دالة ذات معاملات إدخال صفرية أو أكثر وقيمة مُرتجعة. إن طبيعته المُدمجة تُبسط العديد من السيناريوهات. دعونا نعيد هيكلة المثال السابق:


public class Example
{
    public static void PerformOperationAndPrint(double num, Func<double, double> operation)
    {
        double result = operation(num);
        Console.WriteLine($"النتيجة: {result}");
    }

    public static double Square(double x) => x * x;
    public static double Cube(double x) => x * x * x;

    public static void Main(string[] args)
    {
        PerformOperationAndPrint(5, Square); // الناتج: النتيجة: 25
        PerformOperationAndPrint(5, Cube);  // الناتج: النتيجة: 125
    }
}

يُحقق هذا نفس النتيجة مع عدد أقل من الأسطر البرمجية. يُحدد Func<double, double> دالة تقبل قيمة من نوع double وتُعيد قيمة من نوع double. تتكيف معلمات النوع العام مع توقيعات الدوال المختلفة (مثلًا، Func<int, string>).

استخدام مندوب Action<>

Action<> هو مندوب عام للدوال ذات معاملات إدخال صفرية أو أكثر ونوع مُرتجع void (بدون قيمة مُرتجعة). استخدمه عندما لا تُعيد الدوال قيمًا.


public class Example
{
    public static void PerformAction(string message, Action<string> action)
    {
        action(message);
    }

    public static void PrintMessage(string msg) => Console.WriteLine(msg);
    public static void PrintMessageToUpper(string msg) => Console.WriteLine(msg.ToUpper());

    public static void Main(string[] args)
    {
        PerformAction("Hello, world!", PrintMessage);       // الناتج: Hello, world!
        PerformAction("Hello, world!", PrintMessageToUpper); // الناتج: HELLO, WORLD!
    }
}

يُمثل Action<string> دالة تقبل سلسلة نصية ولا تُعيد أي شيء. يستخدم PerformAction هذا لتنفيذ إجراءات الطباعة المختلفة.

الخلاصة

إن تمرير الدوال كمعاملات هو ميزة قوية في C#. توفر المندوبون المُخصصون أقصى قدر من التحكم، بينما يوفر Func<> و Action<> حلولًا مُدمجة ومُريحة. يعتمد أفضل نهج على متطلبات تطبيقك المحددة. إن إتقان هذه التقنيات هو مفتاح كتابة كود C# أكثر قابلية للتكيف والصيانة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *