في أي برنامج، الكود بيتنفذ بشكل افتراضي سطر ورا سطر من فوق لتحت. ده بنسميه “تنفيذ تسلسلي” أو Sequential Execution.

لكن في أغلب الأحيان، بنكون محتاجين نتحكم في مسار تنفيذ البرنامج ده. هنا بيجي دور الـ Control Flow Statements (جمل التحكم في المسار).

الـ Control Flow Statements هي الأدوات اللي بتخلينا نغير المسار الطبيعي ده، وتدينا تحكم أكبر. يعني نقدر:

  • نختار جزء معين من الكود يتنفذ بناءً على شرط (زي if-else).
  • نكرر جزء معين من الكود أكتر من مرة (زي for loop).
  • نقفز من مكان لمكان في الكود (زي goto).

باستخدام الأدوات دي، بنقدر نكتب برامج أذكى وأكثر تعقيدًا.

Types of Control Flow Statements

جمل التحكم في C# بتتقسم لتلات فئات أساسية:


Selection Statements (Conditions)

دي الأدوات اللي بتخلي البرنامج “ياخد قرارات”. يعني بينفذ أجزاء مختلفة من الكود بناءً على نتيجة شرط معين.

If-Else Statement

دي أشهر وأبسط أداة لاتخاذ القرارات.

1. Simple if Statement

بتنفذ بلوك الكود اللي جواها لو الشرط true. لو false، بتتجاهل البلوك ده وتكمل.

Flowchart:

graph TD
    Start((Start)) --> Condition{Is Condition True?};
    Condition -- True --> Process[Execute If Block];
    Condition -- False --> End((End));
    Process --> End;

2. if-else Statement

هنا لو الشرط true، بينفذ بلوك الـ if. لو false، بينفذ بلوك الـ else.

Flowchart:

graph TD
    Start((Start)) --> Condition{Is Condition True?};
    Condition -- True --> IfBlock[Execute If Block];
    Condition -- False --> ElseBlock[Execute Else Block];
    IfBlock --> End((End));
    ElseBlock --> End((End));

Example: Even or Odd Number

Console.WriteLine("Enter a Number: ");
int number = Convert.ToInt32(Console.ReadLine());
 
if (number % 2 == 0)
{
    // This block runs if the condition is true
    Console.WriteLine($"{number} is an Even Number");
}
else
{
    // This block runs if the condition is false
    Console.WriteLine($"{number} is an Odd Number");
}

3. if-else if Ladder

بنستخدمها لما يكون عندنا أكتر من شرط محتاجين نتحقق منهم بالترتيب. أول شرط true بيقابله بينفذ الكود بتاعه وبيتجاهل باقي الشروط.

int i = 20;
 
if (i == 10)
{
    Console.WriteLine("i is 10");
}
else if (i == 15)
{
    Console.WriteLine("i is 15");
}
else if (i == 20)
{
    // This condition is true, so this block will execute
    Console.WriteLine("i is 20");
}
else
{
    // This is a fallback if no conditions are met
    Console.WriteLine("i is not present");
}

4. Nested if-else Statement

معناها إننا بنحط جملة if-else جوه جملة if-else تانية. بنستخدمها لما نحتاج نتحقق من شرط تاني بعد ما الشرط الأولاني يكون اتحقق.

Example: Finding the largest of three numbers

int a = 15, b = 25, c = 10;
int LargestNumber;
 
// Outer if
if (a > b)
{
    // Inner if
    if (a > c)
    {
        LargestNumber = a;
    }
    else
    {
        LargestNumber = c;
    }
}
else
{
    // Inner if
    if (b > c)
    {
        LargestNumber = b;
    }
    else
    {
        LargestNumber = c;
    }
}
Console.WriteLine($"The Largest Number is: {LargestNumber}"); // Output: 25

5. Short Hand if-else (Ternary Operator)

ده اختصار بسيط لـ if-else لما نكون عايزين نخصص قيمة لمتغير بناءً على شرط.

الصيغة بتاعته: variable = (condition) ? value_if_true : value_if_false;

int time = 20;
 
// Instead of a full if-else block...
string result = (time < 18) ? "Good day." : "Good evening.";
 
Console.WriteLine(result); // Output: Good evening.

Switch Statement

الـ switch هي بديل أنظف وأحيانًا أسرع للـ if-else if ladder الطويلة، خصوصًا لما نكون بنقارن متغير واحد بقيم ثابتة كتير.

  • بتختار بلوك كود واحد (case) يتنفذ بناءً على قيمة المتغير.
  • الـ break إجبارية في نهاية كل case عشان تمنع التنفيذ إنه يقع ويكمل للـ case اللي بعدها (Fall-through).
  • الـ default اختيارية، وبتتنفذ لو مفيش أي case طابقت القيمة.

Basic Example

int day = 4;
switch (day)
{
  case 1:
    Console.WriteLine("Monday");
    break;
  case 2:
    Console.WriteLine("Tuesday");
    break;
  case 4: // Matches!
    Console.WriteLine("Thursday");
    break; // Exit the switch
  default:
    Console.WriteLine("Some other day");
    break;
}

Grouping Cases

لو أكتر من case ليهم نفس الكود، ممكن نحطهم ورا بعض.

string str = "C#";
switch (str)
{
    case "C#":      
    case "Java":
    case "C":
        // All three cases above will execute this block
        Console.WriteLine("It’s a Programming Langauge");
        break;
    case "MSSQL":
    case "MySQL":
        Console.WriteLine("It’s a Database");
        break;
    default:
        Console.WriteLine("Invalid Input");
        break;
}

ملحوظة أداء (Switch vs. If-Else): لو عندك حالات كتير بتعتمد على قيم بسيطة (زي int أو char)، الـ switch غالبًا بيكون أسرع لأن الكومبايلر ممكن يحوله لـ Jump Table، اللي بتوصل للـ case الصح في خطوة واحدة تقريبًا (O(1)). أما الـ if-else if بتمشي على الشروط بالترتيب (O(N)). الفرق ده بيقل لو بتستخدم string.


Iteration Statements (Loops)

الـ Loops (الحلقات التكرارية) بتخلينا نكرر جزء من الكود أكتر من مرة لحد ما شرط معين يتكسر.

While Loop

بتكرر الكود طالما الشرط بتاعها true.

  • الـ Entry-Controlled Loop: بتتحقق من الشرط قبل ما تنفذ الكود لأول مرة. لو الشرط false من البداية، الكود مش هيتنفذ ولا مرة.
int x = 1;
while (x <= 5) // Condition is checked first
{
    Console.WriteLine("Value of x:" + x);
    x++; // Important: update the variable to avoid an infinite loop
}

Do-While Loop

شبه الـ while، لكنها بتنفذ الكود مرة واحدة على الأقل الأول، وبعدين تتحقق من الشرط.

  • الـ Exit-Controlled Loop: بتتحقق من الشرط بعد تنفيذ الكود.

استخدام مثالي: القوائم التفاعلية اللي بتسأل المستخدم لو عايز يكمل.

char choice;
do
{
    Console.WriteLine("Perform an action...");
    // ... logic ...
    
    Console.WriteLine("Press Y to continue, any other key to terminate");
    choice = Convert.ToChar(Console.ReadLine());
    
} while (Char.ToUpper(choice) == 'Y'); // Condition is checked at the end

For Loop

أشهر loop بنستخدمها لما نكون عارفين عدد مرات التكرار مقدمًا. بتدمج التهيئة، الشرط، والعداد في سطر واحد.

Syntax: for (initialization; condition; iterator)

// This loop will run 5 times (for i = 0, 1, 2, 3, 4)
for (int i = 0; i < 5; i++)
{
    Console.WriteLine(i);
}

Foreach Loop

بنستخدمها مخصوص عشان نلف على عناصر مجموعة (collection) زي Array أو List، من غير ما نحتاج index.

string[] cars = {"Volvo", "BMW", "Ford"};
foreach (string car in cars)
{
  Console.WriteLine(car);
}

Nested Loops

معناها إننا نحط loop جوه loop تانية. الـ loop الداخلية بتخلص كل تكراراتها مع كل تكرار من الـ loop الخارجية.

// Outer loop for rows
for (int i = 1; i <= 3; i++)
{
    Console.Write($"Row {i}: ");
    // Inner loop for columns
    for (int j = 1; j <= 5; j++)
    {
        Console.Write($"{j} ");
    }
    Console.WriteLine(); // New line after each row
}

Jump Statements

دي جمل بتنقل تنفيذ البرنامج من مكانه الحالي لمكان تاني بشكل فوري.

break

بتستخدم عشان تخرج فورًا من الـ loop الحالية أو من الـ switch statement.

for (int i = 1; i <= 10; i++)
{
    if (i == 5)
    {
        break; // Exit the loop when i is 5
    }
    Console.WriteLine(i); // This will print numbers from 1 to 4
}
Console.WriteLine("Loop finished.");

لو استخدمتها في nested loop، هي بتخرج من الـ loop الداخلية فقط.

continue

بتستخدم عشان تتجاهل باقي الكود في التكرار الحالي، وتقفز على طول لبداية التكرار اللي بعده في الـ loop.

for (int i = 1; i <= 5; i++)
{
    if (i == 3)
    {
        continue; // Skip iteration where i is 3
    }
    Console.WriteLine(i); // This will print 1, 2, 4, 5
}

goto

بتنقل التنفيذ مباشرة لـ label معين في الكود. الـ label هو اسم بنعرفه وبعده نقطتين (:).

Console.WriteLine("Start");
goto MyLabel;
Console.WriteLine("This line will be skipped.");
 
MyLabel: // This is a label
Console.WriteLine("Jumped to MyLabel!");

تحذير شديد: استخدام goto يعتبر ممارسة سيئة (bad practice) في البرمجة الحديثة. بيخلي الكود صعب جدًا في القراءة والتتبع والصيانة. تجنبه تمامًا إلا لو في حالات نادرة جدًا ومبررة.