تخطَّ إلى المحتوى

المتغيرات وأنواع البيانات في C#‎

الدرس 2 من 11 · C#

C#‎ لغة حديثة وأنيقة صممتها مايكروسوفت، وتجمع بين صرامة الأنواع التي تحمي من الأخطاء وسهولة الكتابة التي تريح المبرمج. ستستخدمها لبرامج ويندوز، وتطبيقات الويب، وألعاب Unity. في هذا الدرس ستتعرف على المتغيرات وأنواعها، وعلى ميزة ستحبها كثيراً: إدراج القيم داخل النصوص بعلامة $.

string name = "سارة";
int points = 10;
points += 5;
Console.WriteLine(name + " لديها " + points + " نقطة");
Console.WriteLine($"{name} لديها {points} نقطة");
الناتج
سارة لديها 15 نقطة
سارة لديها 15 نقطة
  • الصيغة: النوع ثم الاسم ثم القيمة، وفاصلة منقوطة في النهاية.
  • السطران يطبعان نفس النتيجة، لكن الثاني أوضح بكثير: علامة $ قبل النص تسمح بوضع المتغيرات بين قوسين معقوفين { } مباشرة. هذه الميزة اسمها النصوص المُدرَجة (String Interpolation).

تخيّل المتغيرات مثل صناديق مكتوب عليها نوع المحتوى: صندوق «للأرقام الصحيحة فقط»، وصندوق «للنصوص فقط». C#‎ لا تسمح لك أبداً بوضع نص في صندوق الأرقام.

int students = 30;
double price = 12.5;
decimal balance = 99.95m;
bool isOpen = true;
char grade = 'A';
Console.WriteLine($"{students} {price} {balance} {isOpen} {grade}");
الناتج
30 12.5 99.95 True A
النوع يخزن ملاحظة
int أعداد صحيحة الأكثر استخداماً
double أعداد عشرية للحسابات العلمية والعامة
decimal أعداد عشرية دقيقة جداً للأموال، والقيمة تنتهي بحرف m
bool true أو false تُطبع True و False
char حرف واحد بين علامتين مفردتين
string نص بين علامتين مزدوجتين

لماذا decimal للأموال؟ لأن double يخزن بعض الكسور بتقريب بسيط جداً، وهذا مقبول في الفيزياء لكنه غير مقبول في حسابات البنوك، حيث يجب أن يكون كل قرش دقيقاً.

Console.WriteLine(10 / 4);
Console.WriteLine(10.0 / 4);
Console.WriteLine(10 % 4);
الناتج
2
2.5
2

قسمة عددين صحيحين تحذف الكسر. اجعل أحد الطرفين عشرياً للحصول عليه.

var city = "القاهرة"; // string
const double Tax = 0.14; // ثابت
  • var: يستنتج المترجم النوع من القيمة، ويبقى النوع ثابتاً بعد ذلك.
  • const: قيمة ثابتة معروفة وقت كتابة الكود ولا تتغير.
int n = int.Parse("25");
Console.WriteLine(n + 5);
Console.WriteLine("25" + 5);
bool ok = int.TryParse("abc", out int result);
Console.WriteLine($"{ok} {result}");
الناتج
30
255
False 0
  • int.Parse: من نص إلى رقم، وإذا لم يكن النص رقماً يتوقف البرنامج بخطأ.
  • int.TryParse: يحاول التحويل، ويُرجع true أو false، ويضع الناتج في المتغير بعد out. هذا هو الأسلوب الآمن مع إدخال المستخدم.
  • "25" + 5 تعطي "255"، لأن + مع نص تعني الدمج.

ومن عشري إلى صحيح:

double avg = 7.9;
Console.WriteLine((int)avg);
Console.WriteLine(Convert.ToInt32(avg));
الناتج
7
8

لاحظ الفرق: (int) تقطع الكسر، أما Convert.ToInt32 فـتقرّب لأقرب عدد صحيح.

تنسيق الأرقام في النصوص المُدرَجة

Section titled “تنسيق الأرقام في النصوص المُدرَجة”
Console.WriteLine($"السعر: {12.5:F2} جنيه");
Console.WriteLine($"{1 + 2} و {name.Length}");
الناتج
السعر: 12.50 جنيه
3 و 4

:F2 بعد القيمة تعني «رقمين بعد الفاصلة». وبين { } يمكنك كتابة أي تعبير، مثل عملية حسابية أو طول نص.

string? nickname = null;
Console.WriteLine(nickname ?? "لا يوجد");
الناتج
لا يوجد
  • string?: نص يمكن أن يكون null، أي بلا قيمة.
  • ??: «إذا كانت القيمة null، فاستخدم هذه البديلة».

C#‎ الحديثة تحذرك عندما تستخدم متغيراً قد يكون null دون فحصه، وهذا يحميك من خطأ شهير اسمه NullReferenceException.

string productName = "سماعة";
double unitPrice = 150.0;
int quantity = 2;
double total = unitPrice * quantity;
Console.WriteLine($"المنتج: {productName}");
Console.WriteLine($"الإجمالي: {total} جنيه");
الناتج المتوقع
المنتج: سماعة
الإجمالي: 300 جنيه

تحدٍّ: حوّل الأسعار إلى decimal، واطبع الإجمالي بعد ضريبة 14% برقمين عشريين باستخدام :F2.

  • نسيان m مع decimal: decimal x = 9.95; خطأ، لأن 9.95 وحدها double. اكتب 9.95m.
  • Parse مع إدخال غير موثوق: يتوقف البرنامج إذا كتب المستخدم حروفاً. استخدم TryParse.
  • نسيان $ قبل النص: "{name}" تطبع الأقواس حرفياً. الصحيح $"{name}".

سؤال

أي نوع هو الأنسب لتخزين رصيد حساب بنكي في C#‎؟

سؤال

ماذا يطبع Console.WriteLine($"{2 + 3}");؟

  • الأنواع الأساسية: int و double و decimal للأموال و bool و char و string.
  • var يستنتج النوع، و const للثوابت.
  • $"...{x}..." لإدراج القيم في النصوص، و :F2 لتنسيق الكسور.
  • int.Parse و int.TryParse الأأمن للتحويل، و (int) تقطع بينما Convert.ToInt32 تقرّب.
  • string? يقبل null، و ?? للقيمة البديلة.