0Pricing
C# Academy · درس

الدوال المحلية مقابل Lambdas

اختاروا بين الدوال المحلية وLambdas

الدوال المحلية مقابل Lambdas درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

الدوال المحلية مقابل تعبيرات لامبدا

تتيح لك كل من الدوال المحلية وتعبيرات لامبدا تعريف دوال صغيرة داخل أسلوب. وتتشارك في الكثير من الخصائص، لكنها تختلف في الصياغة والإمكانات والأداء. ويساعد اختيار الخيار المناسب على إبقاء الكود واضحًا وفعالًا.

طريقتان لكتابة دالة مساعدة

تُكتب هنا الدالة المساعدة نفسها لتربيع قيمة بطريقتين: كدالة محلية، وكتعبير لامبدا مسند إلى مفوض. وتعطي الطريقتان النتيجة نفسها.

using System;

public class Program
{
    public static void Main()
    {
        int SquareFn(int n) => n * n;       // local function
        Func<int, int> squareLambda = n => n * n; // lambda

        Console.WriteLine(SquareFn(4));
        Console.WriteLine(squareLambda(4));
    }
}

تتيح الدوال المحلية الاستدعاء الذاتي بسهولة

يمكن للدالة المحلية استدعاء نفسها باسمها. أما تعبير لامبدا فلا يمكنه الإشارة إلى متغيره الخاص أثناء التهيئة، ولذلك يكون الاستدعاء الذاتي مع تعبيرات لامبدا معقدًا.

using System;

public class Program
{
    public static void Main()
    {
        // Clean recursion with a local function
        int Factorial(int n) => n <= 1 ? 1 : n * Factorial(n - 1);
        Console.WriteLine(Factorial(5));
    }
}

يمكن أن تكون الدوال المحلية عامة

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

using System;

public class Program
{
    public static void Main()
    {
        T First<T>(T[] items) => items[0]; // generic local function

        Console.WriteLine(First(new[] { 9, 8, 7 }));
        Console.WriteLine(First(new[] { "a", "b" }));
    }
}

الأداء: تجنب تخصيص المفوض

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

using System;

public class Program
{
    public static void Main()
    {
        // Direct call, no delegate or closure allocation
        static int Add(int a, int b) => a + b;

        int total = 0;
        for (int i = 0; i < 5; i++) total = Add(total, i);
        Console.WriteLine(total);
    }
}

معلمات out وref

يمكن للدوال المحلية تعريف معلمات out وref، بينما لا تستطيع تعبيرات لامبدا، عند استخدامها عبر مفوضات Func/Action الشائعة، ذلك. وهذا يجعل دوال المساعدة بأسلوب try-parse مناسبة للدوال المحلية.

using System;

public class Program
{
    public static void Main()
    {
        bool TryGetFirstDigit(string s, out int digit)
        {
            digit = 0;
            foreach (var c in s)
                if (char.IsDigit(c)) { digit = c - '0'; return true; }
            return false;
        }

        if (TryGetFirstDigit("abc4", out int d))
            Console.WriteLine(d);
    }
}

تتألق لامبدا كوسائط مضمّنة

عندما تحتاجون إلى تمرير سلوك مباشرةً إلى أسلوب مثل Where أو Select في LINQ، تكون لامبدا الخيار الأكثر اختصارًا وقابليةً للقراءة.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var nums = new List<int> { 1, 2, 3, 4, 5, 6 };
        var evens = nums.Where(n => n % 2 == 0).Select(n => n * 10);
        Console.WriteLine(string.Join(", ", evens));
    }
}

يعمل الالتقاط في كلتا الحالتين

يمكن لكلتا الصيغتين التقاط المتغيرات الموجودة في النطاق المحيط. ويكمن الاختلاف أساسًا في الصياغة وتكلفة التخصيص، لا في إمكانية الالتقاط نفسها.

using System;

public class Program
{
    public static void Main()
    {
        int bonus = 10;
        int WithBonusFn(int n) => n + bonus;     // captures
        Func<int, int> withBonusLambda = n => n + bonus; // captures

        Console.WriteLine(WithBonusFn(5));
        Console.WriteLine(withBonusLambda(5));
    }
}

التعيين المؤكد وترتيب التعريف

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

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Triple(4)); // allowed before declaration

        int Triple(int n) => n * 3;
    }
}

الاختيار بينهما

استخدموا دالة محلية للمساعدات المسمّاة والقابلة لإعادة الاستخدام أو العودية أو العامة أو الموجودة في مسارات التنفيذ الحرجة. واستخدموا لامبدا للسلوك القصير والمضمّن الذي يُمرَّر مباشرةً إلى أسلوب آخر. كلاهما أداتان، فاختاروا وفق الغرض.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        static bool IsPrime(int n)
        {
            if (n < 2) return false;
            for (int i = 2; i * i <= n; i++)
                if (n % i == 0) return false;
            return true;
        }

        var primes = Enumerable.Range(2, 20).Where(IsPrime);
        Console.WriteLine(string.Join(", ", primes));
    }
}

جرّبوها بأنفسكم

استخدموا دالة محلية عودية للمنطق الأساسي، ولامبدا لتحويل LINQ المضمّن، بحيث يؤدي كل تركيب المهمة التي يجيدها.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        // Local function: recursive, named, reusable
        static int DigitCount(int n) => Math.Abs(n) < 10 ? 1 : 1 + DigitCount(n / 10);

        var nums = new List<int> { 5, 42, 1000, 7, 88 };
        // Lambda: concise inline projection
        var report = nums.Select(n => n + " has " + DigitCount(n) + " digits");
        foreach (var line in report) Console.WriteLine(line);
    }
}

تحقق سريع

قارنوا بين التركيبين.

مراجعة

تتشابه الدوال المحلية ولامبدا في بعض الجوانب، لكن بينهما اختلافات مهمة.

  • يمكن للدوال المحلية أن تكون عودية أو عامة، وأن تستخدم out/ref.
  • عند استدعائها مباشرةً، تتجنب تخصيصات المفوّضات وعمليات الإغلاق.
  • تكون لامبدا أكثر اختصارًا عند استخدامها كوسائط مضمّنة لأساليب مثل LINQ.
  • اختاروا وفق الغرض: مساعد مسمّى وقابل لإعادة الاستخدام، أم سلوك قصير ومضمّن.

الأسئلة الشائعة

هل درس «الدوال المحلية مقابل Lambdas» مجاني؟

نعم — نص درس «الدوال المحلية مقابل Lambdas» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «الدوال المحلية مقابل Lambdas»؟

اختاروا بين الدوال المحلية وLambdas تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الدوال المحلية مقابل Lambdas»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التصريح عن الدوال المحلية
  2. الإغلاقات والمتغيرات الملتقطة
  3. الدوال المحلية الساكنة
  4. الدوال المحلية مقابل Lambdas
← العودة إلى C# Academy