الـ Operators في لغات البرمجة هي عبارة عن رموز بنستخدمها عشان نعمل عمليات على الـ Operands (المعاملات).

لو بصينا على معادلة بسيطة زي 2 + 3 = 5، هنا الأرقام 2 و3 هما الـ Operands، وعلامات + و \= هما الـ Operators. ببساطة، الـ Operators بتستخدم عشان نتعامل مع المتغيرات والقيم.

int x = 10, y = 20;
 
// Here, '+' is an operator manipulating variables x and y
int result1 = x + y; 
 
// Here, '+' is an operator manipulating values 10 and 20
int result2 = 10 + 20; 

في المثال اللي فات، x و y و 10 و 20 كلهم بنسميهم Operands. الـ Operand ممكن يكون متغير أو قيمة مباشرة.

Types of Operators

الـ Operators بتتقسم حسب نوع العملية اللي بتعملها، وكمان حسب عدد الـ Operands اللي بتحتاجها.

Categorization by Number of Operands

  • الـ Unary Operator: بيحتاج Operand واحد بس عشان يشتغل.
  • الـ Binary Operator: بيحتاج اتنين Operands عشان يشتغل.
  • الـ Ternary Operator: بيحتاج تلاتة Operands عشان يشتغل، وده بنسميه كمان Conditional Operator.

Categorization by Function

graph TD
    A[Operators in C#] --> B[Arithmetic];
    A --> C[Assignment];
    A --> D[Relational / Comparison];
    A --> E[Logical];
    A --> F[Bitwise];
    A --> G[Unary];
    A --> H[Ternary];

Arithmetic Operators

الـ Arithmetic Operators بتُستخدم عشان نعمل العمليات الحسابية والرياضية زي الجمع والطرح والضرب وغيرهم.

Example

using System;
 
namespace OperatorsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int Result;
            int Num1 = 20, Num2 = 10;
 
            // Addition Operation
            Result = (Num1 + Num2);
            Console.WriteLine($"Addition Operator: {Result}");
 
            // Subtraction Operation
            Result = (Num1 - Num2);
            Console.WriteLine($"Subtraction Operator: {Result}");
 
            // Multiplication Operation
            Result = (Num1 * Num2);
            Console.WriteLine($"Multiplication Operator: {Result}");
 
            // Division Operation
            Result = (Num1 / Num2);
            Console.WriteLine($"Division Operator: {Result}");
 
            // Modulo Operation
            Result = (Num1 % Num2);
            Console.WriteLine($"Modulo Operator: {Result}");
 
            Console.ReadKey();
        }
    }
}

Assignment Operators

الـ Assignment Operators بتُستخدم عشان نخصص قيمة لمتغير. الطرف الشمال من العملية لازم يكون متغير، والطرف اليمين ممكن يكون قيمة أو تعبير رياضي (expression) بيرجع قيمة.

مهم جدًا إن القيمة اللي في الطرف اليمين تكون من نفس نوع البيانات (Data Type) للمتغير اللي في الطرف الشمال، وإلا هيحصل compile-time error.

Example

using System;
 
namespace OperatorsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // Initialize variable x
            int x = 15;
            x += 10;  // same as x = x + 10
            Console.WriteLine($"Add Assignment Operator: {x}");
 
            x = 20;
            x -= 5;  // same as x = x - 5
            Console.WriteLine($"Subtract Assignment Operator: {x}");
            
            x = 15;
            x *= 5; // same as x = x * 5
            Console.WriteLine($"Multiply Assignment Operator: {x}");
            
            x = 25;
            x /= 5; // same as x = x / 5
            Console.WriteLine($"Division Assignment Operator: {x}");
            
            x = 25;
            x %= 5; // same as x = x % 5
            Console.WriteLine($"Modulo Assignment Operator: {x}");
 
            Console.ReadKey();
        }
    }
}

Relational (Comparison) Operators

الـ Relational Operators بنسميها كمان Comparison Operators. وظيفتها إنها تحدد العلاقة بين اتنين operands وبترجع نتيجة من نوع boolean (يعني true أو false).

Example

using System;
 
namespace OperatorsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            bool Result;
            int Num1 = 5, Num2 = 10;
 
            // Equal to Operator
            Result = (Num1 == Num2);
            Console.WriteLine($"Equal (==) to Operator: {Result}");
 
            // Greater than Operator
            Result = (Num1 > Num2);
            Console.WriteLine($"Greater (>) than Operator: {Result}");
 
            // Less than Operator
            Result = (Num1 < Num2);
            Console.WriteLine($"Less than (<) Operator: {Result}");
            
            // Greater than or Equal to Operator
            Result = (Num1 >= Num2);
            Console.WriteLine($"Greater than or Equal to (>=) Operator: {Result}");
 
            // Less than or Equal to Operator
            Result = (Num1 <= Num2);
            Console.WriteLine($"Lesser than or Equal to (<=) Operator: {Result}");
 
            // Not Equal To Operator
            Result = (Num1 != Num2);
            Console.WriteLine($"Not Equal to (!=) Operator: {Result}");
            
            Console.ReadKey();
        }
    }
}

Logical Operators

الـ Logical Operators بتُستخدم بشكل أساسي في الشروط زي if وفي الحلقات التكرارية زي for و while عشان نقيم حالة معينة. الـ Operators دي بتتعامل مع تعبيرات boolean فقط.

Example

using System;
 
namespace OperatorsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            bool x = true, y = false, z;
            
            // Logical AND operator
            z = x && y;
            Console.WriteLine("Logical AND Operator (&&) : " + z);
 
            // Logical OR operator
            z = x || y;
            Console.WriteLine("Logical OR Operator (||) : " + z);
 
            // Logical NOT operator
            z = !x;
            Console.WriteLine("Logical NOT Operator (!) : " + z);
 
            Console.ReadKey();
        }
    }
}

Bitwise Operators

الـ Bitwise Operators بتتعامل مع البيانات على مستوى الـ bit، وبتشتغل مع الأنواع الصحيحة (integer types) زي int, long, short, وغيرهم.

  • الـ Bitwise AND &: بيعمل عملية AND على كل bit مقابل في الرقمين. النتيجة بتكون 1 فقط لو الـ bit في الرقمين كان 1.
  • الـ Bitwise OR |: بيعمل عملية OR على كل bit. النتيجة بتكون 1 لو أي bit من الاتنين كان 1.
  • الـ Bitwise XOR ^: بيعمل عملية XOR. النتيجة بتكون 1 لو الـ bits المقابلة مختلفة، و 0 لو متشابهة.

ملحوظة مهمة: لو استخدمنا الـ Bitwise Operators دي مع متغيرات من نوع bool، هتشتغل كأنها Logical Operators بالظبط.

Example (with Integers)

using System;
 
namespace OperatorsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 12, b = 25, Result; // 12 = 00001100, 25 = 00011001
 
            // Bitwise AND: 00001000 -> 8
            Result = a & b;
            Console.WriteLine($"Bitwise AND: {Result}");
 
            // Bitwise OR: 00011101 -> 29
            Result = a | b;
            Console.WriteLine($"Bitwise OR: {Result}");
 
            // Bitwise XOR: 00010101 -> 21
            Result = a ^ b;
            Console.WriteLine($"Bitwise XOR: {Result}");
 
            Console.ReadKey();
        }
    }
}

Example (with Booleans)

using System;
 
namespace OperatorsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            bool a = true, b = false, Result;
 
            // Behaves like Logical AND
            Result = a & b;
            Console.WriteLine($"Bitwise AND: {Result}");
 
            // Behaves like Logical OR
            Result = a | b;
            Console.WriteLine($"Bitwise OR: {Result}");
 
            // Behaves like Logical XOR
            Result = a ^ b;
            Console.WriteLine($"Bitwise XOR: {Result}");
 
            Console.ReadKey();
        }
    }
}

Unary Operators

الـ Unary Operators زي ما قلنا بتحتاج operand واحد بس. بتُستخدم عشان تزود قيمة أو تنقصها.

  • Increment ++: بيزود القيمة بـ 1.
  • Decrement --: بينقص القيمة بـ 1.

كل واحد فيهم ليه شكلين:

  1. الـ Prefix: العلامة بتيجي قبل المتغير (زي ++x و --x). هنا العملية (الزيادة أو النقصان) بتحصل الأول، بعدين بنستخدم قيمة المتغير الجديدة.
  2. الـ Postfix: العلامة بتيجي بعد المتغير (زي x++ و x--). هنا بنستخدم قيمة المتغير القديمة الأول، بعدين العملية بتحصل.

How Unary Operators Work

عشان نفهم الـ Unary Operators بتشتغل إزاي جوه تعبير معقد، نمشي على 5 خطوات بسيطة:

  1. الـ Pre-increment/decrement: أي عملية prefix (++x أو --x) في التعبير بتتنفذ الأول.
  2. الـ Substitution: بنعوّض بالقيم الحالية للمتغيرات في التعبير.
  3. الـ Evaluation: بنحسب قيمة التعبير.
  4. الـ Assignment: بنخصص القيمة النهائية للمتغير اللي على الشمال.
  5. الـ Post-increment/decrement: أي عملية postfix (x++ أو x--) في التعبير بتتنفذ في الآخر خالص.

Complex Example

تعالوا نطبق الخطوات دي على مثال:

int x = 10, y = 20, z;
z = x++ * --y;
// What are the final values of x, y, and z?
  • الخطوة 1 (Prefix): عندنا --y. قيمة y هتنقص 1 وتبقى 19.
  • الخطوة 2 (Substitution): هنعوّض بالقيم. التعبير هيبقى z = 10 * 19. (لاحظ إننا استخدمنا قيمة x القديمة لأنها postfix).
  • الخطوة 3 (Evaluation): هنحسب 10 * 19 اللي هي 190.
  • الخطوة 4 (Assignment): هنخصص القيمة 190 للمتغير z.
  • الخطوة 5 (Postfix): عندنا x++. قيمة x هتزيد 1 وتبقى 11.

يبقى النتيجة النهائية: x = 11, y = 19, z = 190.

نصيحة: Microsoft مش بتنصح باستخدام ++ أو -- جوه تعبيرات معقدة بالشكل ده لأن النتيجة ممكن تكون غير متوقعة لو استخدمت نفس المتغير أكتر من مرة. الأفضل نستخدمهم لوحدهم أو جوه Loops.

Ternary (Conditional) Operator ?:

الـ Ternary Operator هو اختصار لجملة if-else. اسمه Ternary لأنه بياخد 3 أجزاء (operands).

الصيغة بتاعته: Condition ? first_expression : second_expression;

  • الأول بيقيّم الـ Condition.
  • لو true، بينفذ الـ first_expression.
  • لو false، بينفذ الـ second_expression.

Example

using System;
 
namespace OperatorsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 20, b = 10, res;
            
            // Check if a is greater than b
            // If true, res = a. If false, res = b.
            res = (a > b) ? a : b;
 
            Console.WriteLine("Result = " + res); // Output will be 20
            Console.ReadKey();
        }
    }
}

Priority of Operators

العمليات في C# ليها أولوية تنفيذ. الأعلى في القائمة بيتنفذ الأول.

  1. Parentheses ( )
  2. Function and method calls
  3. Postfix x++, x--
  4. Prefix ++x, --x
  5. Arithmetic Operators (*, /, % قبل +, -)
  6. Comparison operators
  7. Logical operators (&& قبل ||)
  8. Conditional operator (Ternary) ? :
  9. Assignment operators
  10. Null-conditional operators ?.

Boolean Variable Naming

تسمية المتغيرات من نوع Boolean بشكل صحيح بتخلي الكود نظيف ومقروء. فيه شوية إرشادات ممكن نتبعها:

  1. استخدام الأفعال المساعدة:

    • ابدأ اسم المتغير بكلمات زي is, has, can, should. ده بيوضح إن المتغير بيمثل حالة.
    • أمثلة: isVisible، hasCompleted، canExecute.
  2. استخدام أسماء وصفية:

    • الاسم لازم يعبر عن الغرض بوضوح.
    • مثال: isAhmedTallerThanAli.
  3. تجنب النفي في الأسماء:

    • بدل ما تسمي المتغير isNotVisible، الأفضل تستخدم isHidden عشان تتجنب اللخبطة.
  4. استخدام صيغة السؤال:

    • مثال: isDoorOpen كأنه بيسأل “هل الباب مفتوح؟“.

Practical Example

public class Room
{
    public bool IsDoorOpen { get; set; }
    public bool HasWindow { get; set; }
    public bool CanEnter { get; set; }
 
    public void CheckRoomStatus()
    {
        if (IsDoorOpen)
        {
            Console.WriteLine("The door is open.");
        }
        else
        {
            Console.WriteLine("The door is closed.");
        }
    }
}

Using Boolean as a Flag

ممكن نستخدم متغير boolean كـ “Flag” عشان نتتبع حالة معينة في البرنامج، زي تفعيل أو تعطيل ميزة. أشهر مثال هو الـ Dark Mode في المواقع.

// The flag to track the current mode
bool isDarkMode = false; // Default is Light Mode
 
// Function to toggle the theme
void ToggleTheme()
{
    // Invert the flag's value
    isDarkMode = !isDarkMode; 
    ApplyTheme();
}
 
// Function to apply styles based on the flag
void ApplyTheme()
{
    if (isDarkMode)
    {
        // Apply dark mode settings
        Console.WriteLine("Theme set to Dark Mode.");
    }
    else
    {
        // Apply light mode settings
        Console.WriteLine("Theme set to Light Mode.");
    }
}

استخدام الـ Flag بيساعد في:

  • تعقب الحالة: بنبقى عارفين دايماً إيه هو الوضع الحالي.
  • تسهيل التغيير: بنقدر نغير الحالة بسهولة عن طريق عكس قيمة الـ Flag.
  • تبسيط المنطق: بدل ما نكتب شروط معقدة، بنستخدم متغير boolean بسيط.

في تطبيقات الويب الحقيقية، ممكن نخزن قيمة الـ Flag ده في الـ Session أو Cookies عشان نحافظ على اختيار المستخدم.