Static readonly أم const في C#: أيهما تختار في 2025؟

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

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

ابدأ الدورة

مقدمة: جدل أبدي لا يفقد أهميته

\n\n

تخيل موقفًا: أنت تكتب كودًا بلغة C# وتحتاج إلى تعريف قيمة لا يجب أن تتغير. أول فكرة تتبادر إلى ذهنك — const. الثانية — static readonly. والثالثة — "ما الفرق أساسًا؟".

\n\n

هذا السؤال هو من أكثر الأسئلة شيوعًا على Stack Overflow. آلاف المطورين، من المبتدئين إلى الخبراء، ما زالوا يتجادلون حول أيهما أفضل. وفي عام 2025، مع إصدار إصدارات جديدة من .NET و C# 13، أصبح هذا الاختيار أكثر إثارة للاهتمام.

\n\n

في هذه المقالة، سنحسم الأمر نهائيًا حول متى نستخدم const ومتى نستخدم static readonly. ستتعلم ليس فقط النظرية، بل ستحصل أيضًا على قواعد واضحة يمكنك تطبيقها اليوم.

\n\n

ما الذي تخفيه المعدّلات؟

\n\n

const: ثابت صارم

\n

المعدّل const في C# هو حرفيًا قيمة "محفورة في الحجر". يجب أن تكون معروفة في مرحلة التجميع. يقوم المترجم باستبدال قيمة الثابت مباشرة في الكود أينما يُستخدم.

\n\n
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 — سيعطي المترجم خطأ.

\n\n

static readonly: ثبات مرن

\n

المعدّل static readonly هو حقل تتم تهيئته مرة واحدة ولا يتغير بعد ذلك. الفرق الرئيسي: يمكن حساب القيمة أثناء تنفيذ البرنامج.

\n\n
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\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
الخاصيةconststatic readonly
وقت التهيئةمرحلة التجميعمرحلة التنفيذ (المُنشئ الثابت)
الأنواع المسموح بهافقط الأنواع البدائية (int, double, string, enum, bool)جميع الأنواع (بما في ذلك الأنواع المرجعية)
الذاكرةيتم نسخ القيمة إلى كل assemblyمرجع واحد في الذاكرة
توافق الإصداراتمشاكل عند تحديث المكتباتآمن
الأداءأقصى أداء (استبدال في مرحلة التجميع)تكلفة بسيطة عند أول استخدام
\n\n

متى تختار const؟

\n\n

استخدم const عندما:

\n
    \n
  • القيمة ثابتة تمامًا — الثوابت الرياضية (π, e)، عدد أيام الأسبوع، الثوابت الفيزيائية.
  • \n
  • القيمة يجب أن تكون متاحة في مرحلة التجميع — مثل السمات (attributes)، switch/case، المعاملات الافتراضية.
  • \n
  • أنت تتحكم في كل الكود — وتتأكد من أن المكتبة لن يتم تحديثها بشكل منفصل.
  • \n
\n\n
// مثالي لـ const\npublic class Physics\n{\n    public const double SpeedOfLight = 299792458; // م/ث\n    public const double GravitationalConstant = 6.67430e-11; // م³/(كجم·ث²)\n}\n\n// استخدام في سمة —                

المدونات

توصيات الكتب