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 isint
.
var y = "Hello";
→ Type here isstring
. -
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.
- لو عايز تستخدم القيمة، لازم تحولها لـنوعها الأصلي (Unboxing).
-
مميزاته:
- مرن جداً. تقدر تخزن أي حاجة فيه.
4. dynamic
:
-
إزاي شغاله؟
الـdynamic
نوع بيتحدد في الرن تايم (Run Time). الكومبايلر مش بيفحصه أثناء الكتابة.
مثال:dynamic x = 10; x = "Ahmed"; // مفيش مشكلة! النوع بيتغير أوتوماتيك
-
مميزاته:
- سهل مع الحاجات الديناميكية (مثل الـCOM Interop أو الـAPIs الخارجية).
- مفيش حاجة للـCasting.
-
عيوبه:
- مش آمن: أي غلط هتكتشفه فقط لما البرنامج يشتغل.
- أقل أداءً لإن التحقق من النوع بيحصل في الرن تايم.
الفروقات الأساسية بينهم:
Feature | var | object | dynamic |
---|---|---|---|
وقت التحديد | (Compiler) Compile Time | Compile 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) ومستعد تتحمل أخطاء الرن تايم.