1. الـ Function ده إيه؟

هي عبارة عن “مكنة” جواها كود معين بتقوم بعمل حاجة معينة، وانت تقدر تستدعيها أي وقت من أي حتة في الكود. ممكن تسميها Method لو كانت جوة Class.

  • Function is a block of code which only runs when it is called.
  • Functions are used to perform certain actions.
  • Functions are important for reusing our codes: write the code, use it many times.
  • Any function has 3 main parts
    • Return type
    • Name
    • Parameters

2. بتتكتب إزاي؟

اتكلمنا عن الـ Cs Access Modifiers قبل كدا

[access modifier] [return type] [Function name](parameters)  
{  
    // Things to do (Body)
    return value; // (We will not use it if return is void)  
}  
  • مثال:
public int Sum(int x, int y)  
{  
    return x + y;  
}  

3. أنواع Functions:

  • واحدة مش بترجع حاجة (void):

    void SayHello()  
    {  
        Console.WriteLine("Hello Ya Gama3a!");  
    }  
  • واحدة بتاخد parameters وبتعمل return:

    double CalculateTax(double price)  
    {  
        return price * 0.14;  
    }  
  • واحدة فيها optional parameters:

    void SendMessage(string msg = "Ya Habibi")  
    {  
        Console.WriteLine(msg);  
    }  
    // تقدر تستدعيها:  
    SendMessage(); // هتطبع "Ya Habibi"  

4. استدعاء ال Function:

  • لو ال return void:

    SayHello(); // كدا كدا مش هترجع حاجة  
  • لو فيها return:

    int total = Sum(3, 5); // total = 8   

5. Overloading (تعدد الأشكال):

دا شكل من أشكال الـ Cs Polymorphism تقدر تعمل أكتر من function بنفس الاسم، لكن يختلفوا في الـ parameters (عددهم أو نوعهم).

int Multiply(int a, int b) => a * b;  
double Multiply(double a, double b) => a * b;  

6. Cs params Keyword:

دي بتخليك تبعت عدد parameters مش ثابت من نفس النوع.

int Total(params int[] numbers)  
{  
    return numbers.Sum();  
}  
// تستخدمها كدا:  
Total(1, 2, 3); // هيرجع 6  

7. Cs Lambda Expressions:

طريقة مختصرة لكتابة function في سطر واحد.

Func<int, int, int> add = (a, b) => a + b;  
Console.WriteLine(add(2, 3)); // 5  

8. ref و out Parameters:

اتكلمنا عنهم في الـ Cs Pass parameters

  • الـref: بتعدل على المتغير الأصلي (مش بنسخته)، ومش لازم يبقى معمول له initialize.
  • الـout: شبه ref، لكن محتاج initialize قبل ما تبعتهم.
void Swap(ref int x, ref int y)  
{  
    int temp = x;  
    x = y;  
    y = temp;  
}  

9. إزاى تكتب function كويس؟ (Best Practices):

  • اسم function يدل على شغلها: مثلاً CalculateSalary() أحسن من DoWork().
  • الـfunction واحدة = مهمة واحدة: متحطش كل حاجة في function واحدة.
  • متكررش نفسك (DRY): لو لقيت كود مكتوب أكتر من مرة، حوله لـ function.
  • استخدم XML Comments:
    /// <summary>  
    /// What function Doing here
    /// </summary>  

10. Static Methods:

اتكلمنا عنها في الـ Cs Static دي functions بتاعة الـ Class نفسه، مش الـ Object.

public static class Helper  
{  
    public static bool IsEven(int num) => num % 2 == 0;  
}  
// تستخدمها من غير ما تعمل new:  
Helper.IsEven(4); // هيرجع true  

11. Call Stack

إنت لو عندك 3 مهام:

  1. تكتب إيميل
  2. تروح تشرب مية
  3. ترد على تليفون

هتقول:

  • أبدأ في كتابة الإيميل أوقف الإيميل عشان تروح تشرب أوقف الشرب عشان ترد على التليفون بعد ما تخلص التليفون ترجع تكمل الشرب بعد الشرب ترجع تكمل الإيميل.

الـ Call Stack هي اللي بتسجل إيه اللي “مُوقف” عشان ترجع تكمل منين!


مثال كود C#:
using System;
 
class Program
{
    static void Main()
    {
        Console.WriteLine("بدأ البرنامج");
        FunctionA();
        Console.WriteLine("خلص البرنامج");
    }
 
    static void FunctionA()
    {
        Console.WriteLine("دخلت FunctionA");
        FunctionB();
        Console.WriteLine("خرجت من FunctionA");
    }
 
    static void FunctionB()
    {
        Console.WriteLine("دخلت FunctionB");
        FunctionC();
        Console.WriteLine("خرجت من FunctionB");
    }
 
    static void FunctionC()
    {
        Console.WriteLine("دخلت FunctionC");
        Console.WriteLine("خرجت من FunctionC");
    }
}

الـ Call Stack هتكون كدا خطوة خطوة:
  1. البرنامج يبدأ:

    • الـ Stack: Main()
  2. Main() تستدعي FunctionA():

    • الـ Stack: Main() → FunctionA()
  3. FunctionA() تستدعي FunctionB():

    • الـ Stack: Main() → FunctionA() → FunctionB()
  4. FunctionB() تستدعي FunctionC():

    • الـ Stack: Main() → FunctionA() → FunctionB() → FunctionC()
  5. FunctionC() تخلص:

    • الـ Stack: Main() → FunctionA() → FunctionB()FunctionC() اتمسحت
  6. FunctionB() تخلص:

    • الـ Stack: Main() → FunctionA()FunctionB() اتمسحت
  7. FunctionA() تخلص:

  • الـ Stack: Main()FunctionA() اتمسحت
  1. Main() تخلص:
  • الـ Stack: فاضية

النتيجة:
بدأ البرنامج  
دخلت FunctionA  
دخلت FunctionB  
دخلت FunctionC  
خرجت من FunctionC  
خرجت من FunctionB  
خرجت من FunctionA  
خلص البرنامج  

إيه اللي بيحصل لو الـ Stack زادت زيادة؟

هتحصل Stack Overflow (زي ما بيحصل لو عملت دالة تستدعي نفسها من غير ما تقف – recursion من غير base case).
مثال:

static void InfiniteLoop()
{
    InfiniteLoop(); // هتستدعي نفسها لـ ما لا نهاية
}

النتيجة: error عشان الـ stack مليانة!


الخلاصة:
  • الـ Call Stack دي اللي بتساعد الكمبيوتر يعرف يرجع يكمل منين بعد ما دالة تخلص.
  • كل استدعاء دالة بيدوس طبقة جديدة في الـ stack، وكل ما دالة تخلص بتنزل من الـ stack.
  • لو الـ stack اتعبى زيادة، البرنامج هيفصل!

12. Recursion

اتكلمنا قبل كدا عن الـ Recursion اللي نقدر نستخدمها هنا برضو احسب الـ Base Case أهم حاجة وشوف كل مرة عايز الـ State ترجع ايه بالظبط

// Factorial
int facto (int n)
{
	if (n == 1)
	{
		return 1;
	}
	return n * facto(n - 1);
}
 
Console.WriteLine(facto(5));
 
// Power
int power(int theBase, int exponent)
{
	if(exponent == 0)
		return 1;
	return the Base * power(theBase, exponent - 1);
}
 
// Fibonacci
int fib(int n) 
{ 
	if (n == 0) return 0; 
	if (n == 1) return 1; 
	return fib(n -1) + fib(n -2); 
}

ملخص الجملة:

الـ Functions في C# هي “مكعبات الليغو” اللي بتبني بيها البرنامج، وكل ما تكتبها كويس، كل ما حياتك أهون 😎.