Const مقابل Readonly في C#: ماذا تختار وما الفرق؟

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Const مقابل Readonly في C#: ما الفرق ومتى تستخدم كل منهما؟

\n\n

كل مطور C# يواجه عاجلاً أم آجلاً معضلة: هل يعلن القيمة كـ const أم كـ readonly؟ للوهلة الأولى، كلتا الكلمتين المفتاحيتين تفعلان الشيء نفسه - تمنعان تغيير المتغير بعد التهيئة. لكن إذا تعمقت أكثر، ستكتشف هاوية كاملة من الاختلافات التي تؤثر على البنية والأداء وحتى أمان الكود.

\n\n

في هذه المقالة، لن نقتصر على سرد الحقائق الجافة من التوثيق. سنحلل سيناريوهات حقيقية، ونعرض المزالق الخفية، ونساعدك على اتخاذ قرار واعٍ. هيا بنا!

\n\n

ما هو const في C#؟

\n\n

Const هو ثابت وقت التجميع. يجب أن تكون قيمته معروفة في وقت التجميع ولا يمكن تغييرها في وقت التشغيل.

\n\n
    \n
  • يمكن أن يكون فقط من الأنواع البدائية: int، double، string، bool، enum و null.
  • \n
  • ضمنياً static - ينتمي للنوع وليس للكائن.
  • \n
  • يتم تضمين القيمة مباشرة في الكود في مرحلة التجميع (مثل الماكرو في C++).
  • \n
  • لا يمكن استخدامه مع new أو الأنواع المرجعية (باستثناء string).
  • \n
\n\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. هذا يعني أنه إذا استخدمت ثابتاً من تجميع آخر، ثم غيرت قيمته، فإن التجميعات القديمة ستظل تستخدم القيمة القديمة - حتى يتم إعادة تجميعها.

\n\n

ما هو readonly في C#؟

\n\n

Readonly هو حقل يمكن تهيئته فقط في وقت الإعلان أو في مُنشئ الفئة. بعد ذلك، لا يمكن تغييره.

\n\n
    \n
  • يمكن أن يكون من أي نوع: سواء كان نوع قيمة أو نوع مرجعي.
  • \n
  • يمكن أن يكون ثابتاً (static) أو خاصاً بالكائن (instance).
  • \n
  • يتم حساب القيمة في وقت التشغيل (مثلاً، يمكن استخدام new أو استدعاء دالة).
  • \n
  • لا يتم تضمينه في الكود - إنه حقل عادي مع حماية ضد الكتابة.
  • \n
\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>، فلن تتمكن من تعيين قائمة جديدة، ولكن يمكنك بسهولة إضافة أو حذف العناصر.

\n\n

مقارنة بين const وreadonly: جدول الاختلافات

\n\n

لترسيخ المعلومات، إليك مقارنة توضيحية:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
المعيارconstreadonly
وقت الحسابالتجميعالتنفيذ (وقت التشغيل)
أنواع البياناتالأنواع البدائية فقط + stringجميع الأنواع
الثباتضمنياً staticيمكن أن يكون static أو instance
قابلية التغييرأبداًفقط في المُنشئ
الوصولكـ

المدونات

توصيات الكتب