مقدمة: جدل أبدي لا يفقد أهميته
\n\nتخيل موقفًا: أنت تكتب كودًا بلغة C# وتحتاج إلى تعريف قيمة لا يجب أن تتغير. أول فكرة تتبادر إلى ذهنك — const. الثانية — static readonly. والثالثة — "ما الفرق أساسًا؟".
هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow. آلاف المطورين، من المبتدئين إلى الخبراء، ما زالوا يتجادلون حول أيهما أفضل. وفي عام 2025، مع إصدار إصدارات جديدة من .NET و C# 13، أصبح هذا الاختيار أكثر إثارة للاهتمام.
\n\nفي هذه المقالة، سنحسم الأمر نهائيًا حول متى نستخدم const ومتى نستخدم static readonly. ستتعلم ليس فقط النظرية، بل ستحصل أيضًا على قواعد واضحة يمكنك تطبيقها اليوم.
ما الذي تخفيه المعدّلات؟
\n\nconst: ثابت صارم
\nالمعدّل const في C# هو حرفيًا قيمة "محفورة في الحجر". يجب أن تكون معروفة في مرحلة التجميع. يقوم المترجم باستبدال قيمة الثابت مباشرة في الكود أينما يُستخدم.
public class MathConstants\n{\n public const double Pi = 3.14159;\n public const int DaysInWeek = 7;\n public const string AppName = "MyApp";\n}\n\nلاحظ: const دائمًا ما يكون static ضمنيًا. لا يمكنك كتابة static const — سيعطي المترجم خطأ.
static readonly: ثبات مرن
\nالمعدّل static readonly هو حقل تتم تهيئته مرة واحدة ولا يتغير بعد ذلك. الفرق الرئيسي: يمكن حساب القيمة أثناء تنفيذ البرنامج.
public class AppSettings\n{\n public static readonly DateTime ReleaseDate = new DateTime(2025, 1, 15);\n public static readonly Guid InstanceId = Guid.NewGuid();\n public static readonly string ConfigPath = GetConfigPath();\n \n private static string GetConfigPath()\n {\n return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "config.json");\n }\n}\n\nالفروق الرئيسية: جدول للمقارنة السريعة
\n\nدعنا نرتب كل شيء في جدول توضيحي:
\n\n| الخاصية | \nconst | \nstatic readonly | \n
|---|---|---|
| وقت التهيئة | \nمرحلة التجميع | \nمرحلة التنفيذ (المُنشئ الثابت) | \n
| الأنواع المسموح بها | \nفقط الأنواع البدائية (int, double, string, enum, bool) | \nجميع الأنواع (بما في ذلك الأنواع المرجعية) | \n
| الذاكرة | \nيتم نسخ القيمة إلى كل assembly | \nمرجع واحد في الذاكرة | \n
| توافق الإصدارات | \nمشاكل عند تحديث المكتبات | \nآمن | \n
| الأداء | \nأقصى أداء (استبدال في مرحلة التجميع) | \nتكلفة بسيطة عند أول استخدام | \n
متى تختار const؟
\n\nاستخدم const عندما:
- \n
- القيمة ثابتة تمامًا — الثوابت الرياضية (π, e)، عدد أيام الأسبوع، الثوابت الفيزيائية. \n
- القيمة يجب أن تكون متاحة في مرحلة التجميع — مثل السمات (attributes)، switch/case، المعاملات الافتراضية. \n
- أنت تتحكم في كل الكود — وتتأكد من أن المكتبة لن يتم تحديثها بشكل منفصل. \n
// مثالي لـ const\npublic class Physics\n{\n public const double SpeedOfLight = 299792458; // م/ث\n public const double GravitationalConstant = 6.67430e-11; // م³/(كجم·ث²)\n}\n\n// استخدام في سمة —