[c#] سينجلتون بواسطة جون سكيت التوضيح


Answers

فيما يتعلق بالسؤال (1): الجواب من جون صحيح ، لأنه يضع ضمنيا الطبقة "المتداخلة" الخاصة من خلال عدم جعلها عامة أو داخلية :-). قد تفعل ذلك أيضًا بشكل صريح بإضافة "خاص":

    private class Nested

فيما يتعلق بالسؤال (2): في الأساس ، ما الذي تخبرك به المشاركة حول preinitfield ونوع التهيئة هو أنه إذا لم يكن لديك منشئ ثابت ، يمكن أن يقوم وقت التشغيل بتهيئته في أي وقت (ولكن قبل استخدامه). إذا كان لديك مُنشئ ثابت ، فقد تقوم التعليمة البرمجية في المُنشئ الثابت بتهيئة الحقول ، مما يعني أن وقت التشغيل مسموح به فقط لتهيئة الحقل عندما تطلب هذا النوع.

لذلك إذا كنت لا تريد أن يقوم وقت التشغيل بتهيئة الحقول "بشكل استباقي" قبل استخدامها ، قم بإضافة منشئ ثابت.

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

التقى هذا اللقاء بمشاركة جون حول موضوع المفرد ، وهو IMO هو الموضوع الأساسي لهذا السؤال. يا والشكوك :-)

أود أن أشير إلى أن رقمه المفرد رقم 3 ، والذي وضع عليه علامة "خاطئ" ، هو في الواقع صحيح (لأن القفل يشير تلقائيًا إلى حاجز ذاكرة عند الخروج ). كما يجب أن يكون أسرع من المفرد رقم 2 عند استخدام المثيل أكثر من مرة (وهو أكثر أو أقل نقطة مفردة :-)). لذا ، إذا كنت تحتاج بالفعل إلى تنفيذ مفردات كسول ، فمن المحتمل أن أذهب إلى ذلك الشخص - لأسباب بسيطة أن (1) من الواضح تمامًا للجميع أن يقرأ التعليمات البرمجية الخاصة بك ما يحدث و (2) أنت تعرف ما سيحدث مع استثناءات.

في حال كنت تتساءل: لن أستخدم أبداً المفرد رقم 6 لأنه يمكن أن يؤدي بسهولة إلى طريق مسدود وسلوك غير متوقع مع استثناءات. للحصول على التفاصيل ، راجع: وضع تأمين lazy ، على وجه التحديد ExecutionAndPublication.

Question
public sealed class Singleton
{
    Singleton() {}

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested() {}
        internal static readonly Singleton instance = new Singleton();
    }
}

أتمنى تطبيق نمط سينغتون لجون سكيت في طلبي الحالي في C #.

لدي شكوك على الكود

  1. كيف يمكن الوصول إلى الطبقة الخارجية داخل الصف المتداخل؟ انا اعني

    internal static readonly Singleton instance = new Singleton();
    

    هو شيء يسمى إغلاق؟

  2. أنا غير قادر على فهم هذا التعليق

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    

    ماذا يقترح علينا هذا التعليق؟




Related