C#: أساسيات الطريقة

1. ما هي الطريقة؟

الطريقة هي كتلة من التعليمات البرمجية تؤدي مهمة محددة. ويؤدي تغليف المنطق المتكرر في طرق إلى تحسين قابلية إعادة استخدام التعليمات البرمجية وسهولة قراءتها.

في لغة C#، يجب تعريف الطرق داخل فئة أو بنية، على عكس الدوال المستقلة في لغة C. وعند استخدام العبارات ذات المستوى الأعلى، يمكنك تعريف دوال محلية.


2. تعريف الدالة واستدعاؤها

(1) قواعد النحو

TEXT 📖 للعرض فقط
access_modifier return_type method_name(parameter_list)
{
    method_body
}

▶ مثال

CSHARP
using System;

class Program
{
    static void SayHello()
    {
        Console.WriteLine("Hello, World!");
    }

    static void Main()
    {
        SayHello();
        SayHello();
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Hello, World!
Hello, World!
💡 لاستدعاء دالة، استخدم الصيغة method_name(arguments). يكفي تعريف الدالة مرة واحدة فقط، ويمكن استدعاؤها عدة مرات.


3. المعلمات والقيم المرجعة

(1) الطرق التي تحتوي على معلمات

تسمح المعلمات لأي دالة باستقبال البيانات من الخارج، مما يمكّنها من معالجة مدخلات مختلفة.

▶ مثال

CSHARP
using System;

class Program
{
    static void Greet(string name)
    {
        Console.WriteLine("Hello, " + name + "!");
    }

    static void Main()
    {
        Greet("Alice");
        Greet("Bob");
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Hello, Alice!
Hello, Bob!

(2) الدوال ذات قيم الإرجاع

تسمح قيم الإرجاع للطريقة بإعادة نتائج الحساب إلى الجهة المستدعية.

▶ مثال

CSHARP
using System;

class Program
{
    static int Add(int a, int b)
    {
        return a + b;
    }

    static void Main()
    {
        int result = Add(3, 5);
        Console.WriteLine("3 + 5 = " + result);
        Console.WriteLine("10 + 20 = " + Add(10, 20));
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
3 + 5 = 8
10 + 20 = 30

4. المعلمات الشكلية والفعلية

المفهوم الوصف المثال
المعلمة الشكلية المعلمات في تعريف الدالة a، b في static int Add(int a, int b)
المعلمة الفعلية القيم التي يتم تمريرها عند استدعاء الدالة 3، 5 في Add(3, 5)
⚠️ المعلمات الشكلية هي إعلانات متغيرات؛ أما المعلمات الفعلية فهي قيم أو تعبيرات محددة. وعند استدعاء دالة ما، يتم تمرير قيم المعلمات الفعلية إلى المعلمات الشكلية المقابلة لها.


5. عبارة «return»

يخدم البيان return غرضين هما:

  1. إرجاع نتيجة إلى الجهة المستدعية
  2. الخروج فورًا من الدالة — لا يتم تنفيذ التعليمات البرمجية اللاحقة

▶ مثال

CSHARP
using System;

class Program
{
    static string GetGrade(int score)
    {
        if (score >= 90)
            return "Excellent";
        if (score >= 60)
            return "Pass";
        return "Fail";
    }

    static int Max(int a, int b)
    {
        if (a > b)
            return a;
        else
            return b;
    }

    static void Main()
    {
        Console.WriteLine(GetGrade(95));
        Console.WriteLine(GetGrade(70));
        Console.WriteLine(GetGrade(45));
        Console.WriteLine("Larger: " + Max(12, 8));
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Excellent
Pass
Fail
Larger: 12
⚠️ بمجرد تنفيذ return، تنتهي الطريقة على الفور. في الطرق غير الفارغة، يجب أن تُرجع جميع مسارات الكود قيمة.


6. الطرق الخالية من المعلمات

يشير void إلى أن الدالة لا تحتوي على قيمة إرجاع. لا تتطلب الدوال من نوع void وجود عبارة return، ولكن يمكنك استخدام return; للخروج مبكرًا.

▶ مثال

CSHARP
using System;

class Program
{
    static void PrintLine(int length)
    {
        if (length <= 0)
            return;
        string line = new string('-', length);
        Console.WriteLine(line);
    }

    static void PrintInfo(string name, int age)
    {
        Console.WriteLine("Name: " + name);
        Console.WriteLine("Age: " + age);
    }

    static void Main()
    {
        PrintInfo("Alice", 18);
        PrintLine(20);
        PrintLine(-5);
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Name: Alice
Age: 18
--------------------
📌 تُستخدم return; في الدالة الفارغة فقط للخروج المبكر ولا تُرجع أي قيمة.


7. مكدس استدعاءات الدوال

مكدس الاستدعاءات هو آلية إدارة الذاكرة التي تُستخدم عندما يقوم البرنامج بتنفيذ الطرق. في كل مرة يتم فيها استدعاء طريقة ما، يتم إدخال إطار مكدس إلى المكدس؛ وعندما تعود الطريقة، يتم إخراج الإطار من المكدس.

▶ مثال

CSHARP
using System;

class Program
{
    static int Square(int x)
    {
        return x * x;
    }

    static int SumOfSquares(int a, int b)
    {
        int sa = Square(a);
        int sb = Square(b);
        return sa + sb;
    }

    static void Main()
    {
        int result = SumOfSquares(3, 4);
        Console.WriteLine("Result: " + result);
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Result: 25

وتتم عملية الاتصال على النحو التالي:

TEXT 📖 للعرض فقط
1. Main() pushed onto stack
2.   SumOfSquares(3, 4) pushed onto stack
3.     Square(3) pushed → returns 9 → popped
4.     Square(4) pushed → returns 16 → popped
5.   SumOfSquares returns 25 → popped
6. Main → outputs 25 → popped

ℹ️ تعمل المكدس وفقًا لمبدأ «آخر ما يدخل، أول ما يخرج». فكلما زاد عمق تداخل الطرق، زاد عدد إطارات المكدس. ومساحة المكدس محدودة؛ لذا فإن التكرار المفرط قد يتسبب في حدوث تجاوز سعة المكدس.


8. قواعد تسمية الطرق

يتم تسمية الدوال في لغة C# باستخدام PascalCase: حيث تُكتب الحرف الأول من كل كلمة بحرف كبير، دون استخدام أي خطوط سفلية.

النمط المثال اللغة
PascalCase CalculateTotal، GetUserName C#
snake_case calculate_total، get_user_name C، Python

▶ مثال

CSHARP
using System;

class Program
{
    static double CalculateArea(double radius)
    {
        return 3.14159 * radius * radius;
    }

    static bool IsValidAge(int age)
    {
        return age >= 0 && age <= 150;
    }

    static void PrintUserInfo(string name, int age)
    {
        Console.WriteLine(name + ", age " + age);
    }

    static void Main()
    {
        double area = CalculateArea(5.0);
        Console.WriteLine("Area: " + area);
        Console.WriteLine("Valid age: " + IsValidAge(25));
        PrintUserInfo("Alice", 25);
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
Area: 78.53975
Valid age: True
Alice, age 25

✅ يجب أن تبدأ أسماء الطرق بفعل أو عبارة فعلية، مثل Get، Set، Calculate، Is، Print، إلخ.


9. الطرق ذات الجسم التعبيري

قدمت لغة C# 6.0 الدوال ذات الجسم التعبيري، باستخدام => لتبسيط تعريفات الدوال المكونة من سطر واحد.

▶ مثال

CSHARP
using System;

class Program
{
    static int Square(int x) => x * x;

    static double CircleArea(double r) => 3.14159 * r * r;

    static bool IsAdult(int age) => age >= 18;

    static void Main()
    {
        Console.WriteLine(Square(7));
        Console.WriteLine(CircleArea(3.0));
        Console.WriteLine(IsAdult(20));
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
49
28.27431
True
🚀 => هي صيغة مختصرة لتعبير لامدا، وهي تعادل { return expression; }، ولا تنطبق إلا على المنطق أحادي السطر.


10. التمرير بالقيمة

تستخدم لغة C# التمرير بالقيمة بشكل افتراضي: حيث تقوم أنواع القيم بنسخ البيانات، بينما تقوم أنواع المراجع بنسخ المرجع.

▶ مثال

CSHARP
using System;

class Program
{
    static void TryChange(int x)
    {
        x = 999;
    }

    static void Main()
    {
        int num = 10;
        TryChange(num);
        Console.WriteLine("num = " + num);
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
num = 10
⚠️ في حالة التمرير بالقيمة، تكون المعلمة الشكلية نسخة من المعلمة الفعلية. ولا يؤثر تعديل المعلمة الشكلية داخل الدالة على المعلمة الفعلية.


11. أنواع العائدات المتعددة

يمكن أن تُرجع الدوال أنواعًا مختلفة: int، double، string، bool، إلخ.

▶ مثال

CSHARP
using System;

class Program
{
    static int GetLength(string text)
    {
        return text.Length;
    }

    static double GetAverage(int a, int b)
    {
        return (a + b) / 2.0;
    }

    static bool IsPositive(double value)
    {
        return value > 0;
    }

    static string BuildGreeting(string name)
    {
        return "Welcome, " + name + "!";
    }

    static void Main()
    {
        Console.WriteLine(GetLength("Hello"));
        Console.WriteLine(GetAverage(3, 4));
        Console.WriteLine(IsPositive(-2.5));
        Console.WriteLine(BuildGreeting("Alice"));
    }
}
▶ جرّب الكود
TEXT 📖 للعرض فقط
5
3.5
False
Welcome, Alice!

❓ أسئلة شائعة

س هل يمكن أن تكون الدالة خالية من المعلمات؟
ج نعم، ما عليك سوى ترك قائمة المعلمات فارغة، على سبيل المثال static void SayHi().
س هل يمكن أن تحتوي الدالة على عدة عبارات إرجاع؟
ج نعم، ولكن في الدوال غير الفارغة، يجب أن يُرجع كل مسار تنفيذ قيمةً ما.
س هل يمكن لطريقة فارغة أن تستخدم الكلمة return؟
ج نعم، استخدم return; للخروج مبكرًا، لكنها لا يمكنها إرجاع أي قيمة.
س هل يجب أن يكون اسم المعلمات الشكلية والمعلمات الفعلية متطابقًا؟
ج لا، فهي متغيرات مستقلة ويمكن أن تحمل أسماء مختلفة.
س هل يمكن أن توجد دالة في لغة C# خارج نطاق فئة؟
ج لا، يجب أن تكون دوال لغة C# داخل فئة أو بنية (struct)، لكن يمكن تعريف الدوال المحلية ضمن عبارات المستوى الأعلى.

📖 ملخص

📝 تمارين

  1. اكتب دالة static int Factorial(int n) تحسب مضروب n وتُرجع النتيجة
  2. اكتب دالة static bool IsEven(int num) تتحقق مما إذا كان عدد صحيح زوجيًا، باستخدام صيغة التعبير المباشر
  3. اكتب دالة static void PrintMultiplicationTable(int n) تعرض جدول الضرب لـ n (من 1×n حتى 9×n)
  4. اكتب دالة static string ClassifyScore(int score) تُرجع "ممتاز" أو "جيد" أو "ناجح" أو "راسب" بناءً على الدرجة
  5. اكتب دالة static double CalcBMI(double weight, double height) تحسب مؤشر كتلة الجسم (BMI) بناءً على الوزن (كجم) والطول (م)
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%