عند وضع حقول static داخل اي نوع فيجب علينا التأكد من تهيئة تلك الحقول قبل انشاء اي instance من ذلك النوع. في الواقع يوجد هناك طريقتين لتهيئة حقول static وذلك عن طريق التهيئة المباشرة الشائعة أو عن طريق staic constructor والذي هو عبارة عن فنكشن خاص تمتاز به لغة C# يتم تنفيذه قبل استدعاء لأي ميثود او متغير او property لاول مرة في الكلاس.
يمكننا استعمال static counstructor لتهيئة حقول static مما يعطينا قابلية اجراء اي عملية ما قبل تهيئة هذه الحقول او تهيئة الكلاس بشكل عام. فلا يجب عليك استعمال الconstructors العادية أو اي فنكشنات خاصة او اي شكل اخر لتهيئة متغيرات static في برامجك.
سننظر الان للطريقة الشائعة لتهيئة متغيرات static في كلاس ما حيث تعتبر هذه الطريقة الاكثر استخداماً من قبل المطورين , فعندما تحتاج لحجز موقع في الذاكرة لأي حقل من نوع static استخدم الطريقة الشائعة اما اذا احتجت لبعض العمليات اللازمة لتهيئة متغيرات static فعليك بالstatic constructor.
يمكننا ببساطة تهيئة انواع static بساطة كالاتي:
public class MyClass
{
private static readonly MyClass myField = new MyClass();
public static MyClass MyField
{
get { return myField; }
}
private MyClass()
{
}
// باقي الكلاس
}يمكننا ايضاً استعمال static constructor في حال احتجنا لعمليات اكثر تعقيدا من اجل تهيئة تلك المتغيرات كالاتي:
public class MyClass2
{
private static readonly MyClass2 myField;
static MyClass2()
{
myField = new MyClass2();
}
public static MyClass2 MyField
{
get { return myField; }
}
private MyClass2()
{
}
// باقي الكلاس
}يقوم CLR باستدعاء static constructor بشكل تلقائي قبل اول وصول للAppDomain. يمكنك أن تعرف static constructor واحد فقط داخل كلاسك ويجب أن لا يأخذ أي باراميتر وذلك لأن استدعاء هذا الconstructor يتم من قبل CLR.
يجب عليك أيضاً أن تأخذ حذرك من الإستثناءات exceptions التي قد تحصل داخل static constructor حيث انه اذا حصل اي استثناء فإن CLR سيقوم بايقاف عمل برنامجك لإنه لو لم يقم بذلك فإن الكودات التي تحاول انشاء النوع سوف تفشل حتى يتم تفريغ ما في الAppDomain وبالتالي لن يستطيع CLR تهيئة النوع عن طريق تنفيذ static constructor ولن يحاول القيام بذلك مرة اخرى ايضاً لذلك لن يتم تهيئة النوع بشكل صحيح ولذلك تم منع ذلك عن طريق ايقاف البرنامج من قبل CLR.
معالجة الإستثناءات هي اهم سبب يجعلنا نستخدم static constructor بدلاً من الطريقة المباشرة في التهيئة لانك في تلك الطريقة لن تستطيع الامساك بالاستثناءات ومعالجتها اما مع static constructor فيمكنك ذلك كالاتي:
static MyClass2()
{
try
{
myField = new MyClass2();
}
catch
{
// نعالج الخطأ هنا.
}
}اذا يمكننا تهيئة حقول static بالطريقة المباشرة الشائعة أو باستعمال static constructor وكلتاهما طرق واضحة وسهلة تمت اضافتهم إلى C# لازالة الصعوبات المتعلقة في التعامل مع متغيرات static التي تواجهها اللغات الاخرى.
عبد العظيم بخاري