Variables

  • Variables are containers for storing data values.
  • متغير يتغير مع الوقت
  • We can use any Cs Value and Reference Types of data types

Declaring (Creating) Variables

// type variableName = value;
string name = "Corn";
int myNum = 15;
 
// Declare without assigning
int myNum;
// Assignment
myNum = 15;
 
//if you assign a new value to an existing variable, it will overwrite the previous value
int myNum = 15;
myNum = 20; // myNum now is 20
 
int myNum = 5;
double myDoubleNum = 5.99D;
char myLetter = 'D';
bool myBool = true;
string myText = "Hello";

Multiple Variables

To declare more than one variable of the same type, use a comma-separated list:

int x = 5, y = 6, z = 50;
Console.WriteLine(x + y + z);
 
// You can also assign the **same value** to multiple variables in one line
int x, y, z;
x = y = z = 50;

Custom (Variables)

1. Const

  • If you don’t want others (or yourself) to overwrite existing values, you can add the const keyword in front of the variable type.
const int myNum = 15;
myNum = 20; //error

Note: You cannot declare a constant variable without assigning the value. If you do, an error will occur: A const field requires a value to be provided.

2. var (Implicit Typed Variable):

  • إزاي شغاله؟
    بتديها قيمة أولية، وCompiler هو اللي يحدد نوعها أوتوماتيك من القيمة دي. مش بتحدده انت.
    مثال:
    var x = 10; → Type here is int.
    var y = "Hello"; → Type here is string.

  • Rules:

    • مش ممكن تعلنها من غير ما تديلها قيمة أولية.
      ⚠️ var x;غلط!
    • مش ممكن تديلها null في البداية.
      ⚠️ var z = null;غلط!
    • النوع بيتحدد مرة واحدة في (Compile Time) ومتقدرش تغيره.
      مثال:
var x = 5;
x = "Ahmed"; // Error: x is int
  • لازم تستخدمها فين؟

    • لو النوع اسمه طويل (مثلاً في الـLINQ أو مع Cs Lambda Expressions).
    • لما تكون عايز تكود أسرع من غير ما تكتب نوع المتغير كله.
  • ملحوظة:

    • الـvar مش نوع جديد! ده مجرد اختصار.
    • المتغير بيبقا له نوع ثابت (Strongly Typed) من أول ما يتحدد.
    • تأثيره بيبقا بسيط أوي بس برضو بيأثر على قراءة الكود

3. object:

اتكلمنا عنه بالتفصيل في الـ Object

  • إزاي شغاله؟
    الـobject هو أبو كل الأنواع في C#. أي حاجة تقدر تحطها فيه (لأن كل الأنواع مبنية عليه).

    • ملحوظة مهمة: لو حطيت فيه قيمة من نوع بسيط (مثل int أو double)، الكومبايلر هيحولها لـ reference type (عملية اسمها Boxing).
      مثال:
    object x = 5; // هنا الـ5 (القيمة) اتخزنت في الـHeap
  • عيوبه:

    • لو عايز تستخدم القيمة، لازم تحولها لـنوعها الأصلي (Unboxing).
      مثال:
      int y = (int)x; // Casting
    • لو عملت Casting لنوع غلط غلط في الرن تايم (Runtime Error).
    • أبطأ في الأداء بسبب الـBoxing والـCasting.
  • مميزاته:

    • مرن جداً. تقدر تخزن أي حاجة فيه.

4. dynamic:

  • إزاي شغاله؟
    الـdynamic نوع بيتحدد في الرن تايم (Run Time). الكومبايلر مش بيفحصه أثناء الكتابة.
    مثال:

    dynamic x = 10;
    x = "Ahmed"; // مفيش مشكلة! النوع بيتغير أوتوماتيك
  • مميزاته:

    • سهل مع الحاجات الديناميكية (مثل الـCOM Interop أو الـAPIs الخارجية).
    • مفيش حاجة للـCasting.
  • عيوبه:

    • مش آمن: أي غلط هتكتشفه فقط لما البرنامج يشتغل.
    • أقل أداءً لإن التحقق من النوع بيحصل في الرن تايم.

الفروقات الأساسية بينهم:

Featurevarobjectdynamic
وقت التحديد(Compiler) Compile TimeCompile Time (لكن Boxing)(CLR) Run Time
Type Safetyآمن (الكومبايلر بيشيك)غير آمن (محتاج Casting)غير آمن (غلط في الرن تايم)
الأداءسريع (عادي زي أي نوع)بطيء (بسبب Boxing/Unboxing)متوسط (لأنه ديناميكي)
المرونةمحدود (النوع بيتحدد مرة واحدة)عالي (تقدر تخزن أي حاجة)عالي جداً (التغيير في الرن تايم)

أمثلة عملية:

// var
var name = "Mohamed"; // type = string
var age = 25; // type = int
 
// object
object obj1 = 10; // Boxing happening here
object obj2 = "Test";
int num = (int)obj1; // Unboxing
 
// dynamic
dynamic dyn = 10;
dyn = "Text"; // No problem
dyn = dyn.ToUpper(); //If dyn not string -> runtime error

خلاصة:

  • استخدم var لما تكون عايز تكود أسرع ومتأكد من النوع.
  • استخدم object لو محتاج مرونة في تخزين بيانات متنوعة ومستعد تتحمل الـCasting.
  • استخدم dynamic مع الحاجات الديناميكية جداً (مثل الـAPIs أو الـJSON) ومستعد تتحمل أخطاء الرن تايم.