سؤال

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. بداية طريقتي
  5. نهاية الرئيسية

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

هل كانت مفيدة؟

المحلول

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

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

  1. بداية منشئ الفصل (المعروف أيضا باسم cctor)
  2. نهاية ككتور
  3. بداية الرئيسي
  4. بداية طريقتي

هل هذا صحيح?

لا.التسلسل الصحيح هو:

  1. بداية ككتور للبرنامج ، إذا كان هناك واحد.ليس هناك.
  2. نهاية ككتور للبرنامج ، إذا كان هناك واحد.ليس هناك.
  3. بداية الرئيسي
  4. بداية ككتور ل ميكلاس
  5. نهاية ككتور ل ميكلاس
  6. بداية ميكلاس.ميثود

ماذا لو كان هناك مهيئ حقل ثابت?

يسمح كلر لتغيير الترتيب الذي تشغيل إنيتياليزرز حقل ثابت في بعض الحالات.انظر صفحة جون حول هذا الموضوع للحصول على التفاصيل:

الاختلافات بين المنشئات الثابتة ونوع التهيئة

هل من الممكن من أي وقت مضى لطريقة ثابتة مثل MyMethod ليتم استدعاؤها قبل اكتمال ككتور من تلك الفئة?

نعم. إذا كان ككتور نفسه يدعو ميمثود ثم من الواضح سيتم استدعاء ميمثود قبل اكتمال ككتور.

و ككتور لا يدعو ميثود.هل من الممكن من أي وقت مضى لطريقة ثابتة مثل MyMethod ليتم استدعاؤها قبل اكتمال ككتور من ميكلاس?

نعم. إذا كان ككتور يستخدم نوع آخر الذي يدعو ككتور ميمثود ثم سيتم استدعاء ميمثود قبل اكتمال ككتور ميكلاس.

لا يسمي المتحدثون طريقتي ، بشكل مباشر أو غير مباشر!الآن هل من الممكن من أي وقت مضى لطريقة ثابتة مثل MyMethod ليتم استدعاؤها قبل اكتمال ككتور من ميكلاس?

لا.

هل هذا لا يزال صحيحا حتى لو كان هناك العديد من المواضيع المعنية?

نعم.سوف ككتور الانتهاء على موضوع واحد قبل أن يتم استدعاء طريقة ثابتة على أي موضوع.

يمكن أن يسمى ككتور أكثر من مرة?لنفترض أن اثنين من المواضيع على حد سواء تسبب ككتور ليتم تشغيلها.

ويضمن ككتور ليتم استدعاؤها مرة واحدة على الأكثر ، بغض النظر عن عدد المواضيع المعنية.إذا اثنين من المواضيع استدعاء ميمثود "في نفس الوقت" ثم أنها سباق.واحد منهم يفقد السباق وكتل حتى يكمل ميكلاس ككتور على موضوع الفوز.

الخيط الخاسر كتل حتى يتم ككتور? حقا?

حقا.

فماذا لو كان ككتور على الفوز يدعو مؤشر الترابط التعليمات البرمجية التي كتل على قفل اتخذت سابقا من قبل خسارة موضوع?

ثم لديك حالة انعكاس طلب القفل الكلاسيكية.الجمود البرنامج الخاص بك.إلى الأبد.

هذا يبدو خطيرا.كيف يمكنني تجنب الجمود?

إذا كان يؤلمك عندما تفعل ذلك توقف عن فعل ذلك. لا تفعل شيئا يمكن أن يمنع في ككتور.

هل هو فكرة جيدة أن تعتمد على دلالات التهيئة ككتور لفرض متطلبات أمنية معقدة?وهل هي فكرة جيدة أن يكون لديك ككتور يقوم بتفاعلات المستخدم?

ليست الأفكار الجيدة.نصيحتي هي أنه يجب أن تجد طريقة مختلفة لضمان استيفاء الشروط المسبقة التي تؤثر على الأمن لأساليبك.

نصائح أخرى

وفقا ل مسن, ، منشئ ثابت:

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

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

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

# 3 هو في الواقع #1:لا تبدأ التهيئة الثابتة حتى أول استخدام للفئة التي تنتمي إليها.

من الممكن إذا MyMethod يسمى من منشئ ثابت أو كتلة تهيئة ثابتة.إذا كنت لا تحتج MyMethod بشكل مباشر أو غير مباشر من منشئ ثابت الخاص بك ، يجب أن تكون على ما يرام.

من الوثائق (التوكيد):

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

يمكنك ضمان أن 4 ستأتي دائمًا بعد 2 (إذا لم تنشئ مثيلًا لفصلك من الطريقة الثابتة) ، ولكن الأمر نفسه لا ينطبق على 1 و 3.

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

تضمن CLR تشغيل المُنشئ الثابت قبل الوصول إلى أي أعضاء ثابت.ومع ذلك ، تصميمك كريه الرائحة بعض الشيء.سيكون من الأسهل فعل شيء مثل هذا: Genacodicetagpre

مع التصميم الخاص بك ، إذا فشلت المصادقة ، فإن الطريقة الوحيدة لمنع MyMethod من التشغيل هي من خلال طرح استثناء.

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

الإخراج:

اضغط على مفتاح الإدخال

// بعد الضغط على مفتاح الإدخال

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

مرحبًا!

مرحبًا!

هذا هو الترتيب الفعلي للأشياء:

  1. بداية الكود العام
  2. بداية مُنشئ الرمز العام الثابت
  3. نهاية مُنشئ الرمز العام الثابت
  4. بداية الكود العام
  5. نهاية الكود العام

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top