[C#] كيف يعمل منشئ ثابت؟


Answers

وفقا ل MSDN ، وهو منشئ ثابت:

يتم استدعاء مُنشئ ثابت تلقائيًا لتهيئة الفئة قبل إنشاء المثيل الأول أو الإشارة إلى أي أعضاء ثابت.

لذلك سيتم استدعاء منشئ ثابت قبل الأسلوب الثابت يتم استدعاء MyClass.MyMethod() (على افتراض عدم استدعاء أيضا خلال بناء ثابت أو تهيئة حقل ثابت بالطبع).

الآن ، إذا كنت تفعل أي شيء غير متزامن في هذا static constructor ، فمن وظيفتك أن تزامن ذلك.

Question
namespace MyNameSpace
{
    static class MyClass
    {
        static MyClass()
        {
            //Authentication process.. User needs to enter password
        }

        public static void MyMethod()
        {
            //Depends on successful completion of constructor
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass.MyMethod();
        }
    }
}

هذا هو التسلسل الذي افترضته

  1. بدء منشئ ثابت
  2. نهاية منشئ ثابت
  3. بداية الرئيسي
  4. بداية MyMethod
  5. نهاية الرئيسي

الآن في أي سيناريو إذا بدأت 4 قبل 2 أنا ثمل. هل هو ممكن؟




من MSDN (التأكيد على الألغام):

يتم استدعاء مُنشئ ثابت تلقائيًا لتهيئة الفئة قبل إنشاء المثيل الأول أو الإشارة إلى أي أعضاء ثابت .




يتم التأكد من أنه تم استدعاء مُنشئ الفصل الثابت قبل تنفيذ أي من أساليبها. مثال:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Press enter");
        Console.ReadLine();
        Boop.SayHi();
        Boop.SayHi();
        Console.ReadLine();
    }

}

static class Boop
{
    static Boop()
    {
        Console.WriteLine("Hi incoming ...");
    }

    public static void SayHi()
    {
        Console.WriteLine("Hi there!");
    }
}

انتاج:

اضغط دخول

// بعد الضغط على دخول

مرحبا واردة ...

مرحباً!

مرحباً!




أو يمكنك التنقل خلال المصحح.




سيتم استدعاء منشئ ثابت قبل تنفيذ mymethod. ولكن إذا كنت ثمل إذا تم استدعاء 4 قبل 2 ثم أقترح عليك إعادة التفكير في التصميم الخاص بك. لا ينبغي أن تفعل أشياء معقدة في منشئ ثابت على أي حال.