C#: أساسيات الطريقة
1. ما هي الطريقة؟
الطريقة هي كتلة من التعليمات البرمجية تؤدي مهمة محددة. ويؤدي تغليف المنطق المتكرر في طرق إلى تحسين قابلية إعادة استخدام التعليمات البرمجية وسهولة قراءتها.
في لغة C#، يجب تعريف الطرق داخل فئة أو بنية، على عكس الدوال المستقلة في لغة C. وعند استخدام العبارات ذات المستوى الأعلى، يمكنك تعريف دوال محلية.
2. تعريف الدالة واستدعاؤها
(1) قواعد النحو
access_modifier return_type method_name(parameter_list)
{
method_body
}
▶ مثال
using System;
class Program
{
static void SayHello()
{
Console.WriteLine("Hello, World!");
}
static void Main()
{
SayHello();
SayHello();
}
}
Hello, World!
Hello, World!
method_name(arguments). يكفي تعريف الدالة مرة واحدة فقط، ويمكن استدعاؤها عدة مرات.
3. المعلمات والقيم المرجعة
(1) الطرق التي تحتوي على معلمات
تسمح المعلمات لأي دالة باستقبال البيانات من الخارج، مما يمكّنها من معالجة مدخلات مختلفة.
▶ مثال
using System;
class Program
{
static void Greet(string name)
{
Console.WriteLine("Hello, " + name + "!");
}
static void Main()
{
Greet("Alice");
Greet("Bob");
}
}
Hello, Alice!
Hello, Bob!
(2) الدوال ذات قيم الإرجاع
تسمح قيم الإرجاع للطريقة بإعادة نتائج الحساب إلى الجهة المستدعية.
▶ مثال
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));
}
}
3 + 5 = 8
10 + 20 = 30
4. المعلمات الشكلية والفعلية
| المفهوم | الوصف | المثال |
|---|---|---|
| المعلمة الشكلية | المعلمات في تعريف الدالة | a، b في static int Add(int a, int b) |
| المعلمة الفعلية | القيم التي يتم تمريرها عند استدعاء الدالة | 3، 5 في Add(3, 5) |
5. عبارة «return»
يخدم البيان return غرضين هما:
- إرجاع نتيجة إلى الجهة المستدعية
- الخروج فورًا من الدالة — لا يتم تنفيذ التعليمات البرمجية اللاحقة
▶ مثال
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));
}
}
Excellent
Pass
Fail
Larger: 12
return، تنتهي الطريقة على الفور. في الطرق غير الفارغة، يجب أن تُرجع جميع مسارات الكود قيمة.
6. الطرق الخالية من المعلمات
يشير void إلى أن الدالة لا تحتوي على قيمة إرجاع. لا تتطلب الدوال من نوع void وجود عبارة return، ولكن يمكنك استخدام return; للخروج مبكرًا.
▶ مثال
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);
}
}
Name: Alice
Age: 18
--------------------
return; في الدالة الفارغة فقط للخروج المبكر ولا تُرجع أي قيمة.
7. مكدس استدعاءات الدوال
مكدس الاستدعاءات هو آلية إدارة الذاكرة التي تُستخدم عندما يقوم البرنامج بتنفيذ الطرق. في كل مرة يتم فيها استدعاء طريقة ما، يتم إدخال إطار مكدس إلى المكدس؛ وعندما تعود الطريقة، يتم إخراج الإطار من المكدس.
▶ مثال
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);
}
}
Result: 25
وتتم عملية الاتصال على النحو التالي:
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 |
▶ مثال
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);
}
}
Area: 78.53975
Valid age: True
Alice, age 25
✅ يجب أن تبدأ أسماء الطرق بفعل أو عبارة فعلية، مثل
Get،Set،Calculate،Is،
9. الطرق ذات الجسم التعبيري
قدمت لغة C# 6.0 الدوال ذات الجسم التعبيري، باستخدام => لتبسيط تعريفات الدوال المكونة من سطر واحد.
▶ مثال
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));
}
}
49
28.27431
True
=> هي صيغة مختصرة لتعبير لامدا، وهي تعادل { return expression; }، ولا تنطبق إلا على المنطق أحادي السطر.
10. التمرير بالقيمة
تستخدم لغة C# التمرير بالقيمة بشكل افتراضي: حيث تقوم أنواع القيم بنسخ البيانات، بينما تقوم أنواع المراجع بنسخ المرجع.
▶ مثال
using System;
class Program
{
static void TryChange(int x)
{
x = 999;
}
static void Main()
{
int num = 10;
TryChange(num);
Console.WriteLine("num = " + num);
}
}
num = 10
11. أنواع العائدات المتعددة
يمكن أن تُرجع الدوال أنواعًا مختلفة: int، double، string، bool، إلخ.
▶ مثال
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"));
}
}
5
3.5
False
Welcome, Alice!
❓ أسئلة شائعة
static void SayHi().return; للخروج مبكرًا، لكنها لا يمكنها إرجاع أي قيمة.📖 ملخص
- تتكون الدالة من مُعدِّل الوصول، ونوع القيمة المُرجعة، واسم الدالة، وقائمة المعلمات
- المعلمات الشكلية هي المتغيرات الموجودة في التعريف؛ أما المعلمات الفعلية فهي القيم التي يتم تمريرها في موقع الاستدعاء
returnتُرجع نتيجةً وتخرج من الدالة؛ أما الدوال من نوع void فلا تُرجع أي قيمة- تدير مكدس الاستدعاءات الذاكرة المخصصة لتنفيذ الطرق، وفقًا لمبدأ «آخر ما يدخل، أول ما يخرج»
- تتبع تسمية الدوال في لغة C# قواعد كتابة الأسماء بأسلوب PascalCase
- الطرق ذات أجسام التعبيرات
=>تُبسط تعريفات الطرق المكونة من سطر واحد - التمرير الافتراضي بالقيمة: تُنسخ البيانات في أنواع القيم؛ ولا يؤثر تعديل المتغيرات الشكلية على المتغيرات الفعلية
📝 تمارين
- اكتب دالة
static int Factorial(int n)تحسب مضروب n وتُرجع النتيجة - اكتب دالة
static bool IsEven(int num)تتحقق مما إذا كان عدد صحيح زوجيًا، باستخدام صيغة التعبير المباشر - اكتب دالة
static void PrintMultiplicationTable(int n)تعرض جدول الضرب لـ n (من 1×n حتى 9×n) - اكتب دالة
static string ClassifyScore(int score)تُرجع "ممتاز" أو "جيد" أو "ناجح" أو "راسب" بناءً على الدرجة - اكتب دالة
static double CalcBMI(double weight, double height)تحسب مؤشر كتلة الجسم (BMI) بناءً على الوزن (كجم) والطول (م)