Const مقابل Readonly في C#: ما الفرق ومتى تستخدم كل منهما؟
\n\nكل مطور C# يواجه عاجلاً أم آجلاً معضلة: هل يعلن القيمة كـ const أم كـ readonly؟ للوهلة الأولى، كلتا الكلمتين المفتاحيتين تفعلان الشيء نفسه - تمنعان تغيير المتغير بعد التهيئة. لكن إذا تعمقت أكثر، ستكتشف هاوية كاملة من الاختلافات التي تؤثر على البنية والأداء وحتى أمان الكود.
في هذه المقالة، لن نقتصر على سرد الحقائق الجافة من التوثيق. سنحلل سيناريوهات حقيقية، ونعرض المزالق الخفية، ونساعدك على اتخاذ قرار واعٍ. هيا بنا!
\n\nما هو const في C#؟
\n\nConst هو ثابت وقت التجميع. يجب أن تكون قيمته معروفة في وقت التجميع ولا يمكن تغييرها في وقت التشغيل.
\n\n- \n
- يمكن أن يكون فقط من الأنواع البدائية:
int،double،string،bool،enumوnull. \n - ضمنياً
static- ينتمي للنوع وليس للكائن. \n - يتم تضمين القيمة مباشرة في الكود في مرحلة التجميع (مثل الماكرو في C++). \n
- لا يمكن استخدامه مع
newأو الأنواع المرجعية (باستثناءstring). \n
public class MathConstants\n{\n public const double Pi = 3.14159;\n public const int MaxRetries = 5;\n public const string AppName = "MyApp";\n \n // خطأ! الأنواع المرجعية (باستثناء string) لا يمكن\n // public const List<int> Numbers = new List<int>();\n}\n\nعندما يواجه المترجم const، فإنه حرفياً يُدرج القيمة في كود IL. هذا يعني أنه إذا استخدمت ثابتاً من تجميع آخر، ثم غيرت قيمته، فإن التجميعات القديمة ستظل تستخدم القيمة القديمة - حتى يتم إعادة تجميعها.
ما هو readonly في C#؟
\n\nReadonly هو حقل يمكن تهيئته فقط في وقت الإعلان أو في مُنشئ الفئة. بعد ذلك، لا يمكن تغييره.
\n\n- \n
- يمكن أن يكون من أي نوع: سواء كان نوع قيمة أو نوع مرجعي. \n
- يمكن أن يكون ثابتاً (static) أو خاصاً بالكائن (instance). \n
- يتم حساب القيمة في وقت التشغيل (مثلاً، يمكن استخدام
newأو استدعاء دالة). \n - لا يتم تضمينه في الكود - إنه حقل عادي مع حماية ضد الكتابة. \n
public class Config\n{\n public readonly DateTime CreatedAt = DateTime.Now;\n public readonly List<string> Tags;\n public static readonly Guid InstanceId = Guid.NewGuid();\n \n public Config()\n {\n Tags = new List<string> { "csharp", "tutorial" };\n // خطأ! لا يمكن التغيير بعد المُنشئ\n // Tags = new List<string>();\n }\n}\n\nملاحظة مهمة: readonly يحمي فقط المرجع، وليس محتوى الكائن. إذا كان لديك readonly List<int>، فلن تتمكن من تعيين قائمة جديدة، ولكن يمكنك بسهولة إضافة أو حذف العناصر.
مقارنة بين const وreadonly: جدول الاختلافات
\n\nلترسيخ المعلومات، إليك مقارنة توضيحية:
\n\n| المعيار | \nconst | \nreadonly | \n
|---|---|---|
| وقت الحساب | \nالتجميع | \nالتنفيذ (وقت التشغيل) | \n
| أنواع البيانات | \nالأنواع البدائية فقط + string | \nجميع الأنواع | \n
| الثبات | \nضمنياً static | \nيمكن أن يكون static أو instance | \n
| قابلية التغيير | \nأبداً | \nفقط في المُنشئ | \n
| الوصول | \nكـ
المدوناتتوصيات الكتباقرأ أيضًا |