c# - Jon Skeet স্প্লিফিকেশন দ্বারা Singleton




.net design-patterns (2)

  1. না, এই বন্ধ করার সাথে কিছুই করার নেই। একটি নেস্টেড ক্লাসে এখানে ব্যক্তিগত প্রাইভেটকার সহ তার বাইরের শ্রেণীর ব্যক্তিগত সদস্যদের অ্যাক্সেস রয়েছে।

  2. Beforefieldinit আমার নিবন্ধ পড়ুন। আপনি অ-স্ট্যাট স্ট্যাটিক কন্সট্রকটারটি চান নাও হতে পারে - এটি আপনার অলসতার গ্যারান্টিগুলির উপর নির্ভর করে। আপনি সচেতন হওয়া উচিত যে .NET 4 কিছুটা প্রকৃত টাইপ প্রারম্ভিক সিম্যান্টিক্সকে পরিবর্তন করে (এখনও স্পেকের মধ্যে, কিন্তু আগের চেয়ে লাজুক)।

আপনি সত্যিই এই প্যাটার্ন প্রয়োজন যদিও? আপনি কি নিশ্চিত হবেন না যে আপনি দূরে যেতে পারবেন না:

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();
    public static Singleton Instance { get { return instance; } }

    static Singleton() {}
    private Singleton() {}
}
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

    এই মন্তব্য কি আমাদের সুপারিশ করে?


প্রশ্ন সম্পর্কে (1): জোন থেকে উত্তরটি সঠিক, কারণ তিনি জনসাধারণকে অভ্যন্তরীণ বা অভ্যন্তরীণ না করে স্পষ্টভাবে ক্লাস 'নেস্টেড' শ্রেণিকে চিহ্নিত করেছেন :-)। আপনি 'ব্যক্তিগত' যুক্ত করে স্পষ্টভাবে এটিও করতে পারেন:

    private class Nested

প্রশ্ন সম্পর্কে (2): মূলতঃ পূর্বেিনিটফিল্ড এবং টাইপ প্রারম্ভিকীকরণ সম্পর্কে পোস্টটি কী আপনাকে বলে যে যদি আপনার কোন স্ট্যাটিক কন্সট্রাকটর থাকে তবে রানটাইম এটি যে কোনও সময়ে শুরু করতে পারে (কিন্তু এটি ব্যবহার করার আগে)। যদি আপনার স্ট্যাটিক কন্সট্রাকটর থাকে তবে স্ট্যাটিক কন্সট্রকটারে আপনার কোডটি ক্ষেত্রগুলিকে সূচনা করতে পারে, যার মানে আপনি রান টাইটাইমটি শুধুমাত্র তখনই শুরু করতে পারবেন যখন আপনি টাইপটি জিজ্ঞাসা করেন।

তাই যদি আপনি রানটাইম ক্ষেত্রগুলি 'সক্রিয়ভাবে' ক্ষেত্রগুলি ব্যবহার করার আগে তাদের সূচনা না করতে চান তবে স্ট্যাটিক কন্সট্রাকটর যোগ করুন।

আপনি যদি singletons বাস্তবায়ন করছেন তবে উভয় উপায়ে আপনি এটি যতটা সম্ভব অলস হিসাবে শুরু করতে চান এবং রানটাইম মনে করে যে এটি আপনার পরিবর্তনশীলকে সূচনা করতে হবে - অথবা আপনি সম্ভবত যত্ন নিবেন না। আপনার প্রশ্ন থেকে আমি মনে করি আপনি যত তাড়াতাড়ি সম্ভব তাদের চান।

এটি এককন্টনের সম্পর্কে জনের পোস্টের সাথে দেখা করে, যা এই প্রশ্নের অন্তর্নিহিত বিষয় আইএমও। ওহ এবং সন্দেহ :-)

আমি ইঙ্গিত দিতে চাই যে তার সিঙ্গলটন # 3, যা তিনি 'ভুল' হিসাবে চিহ্নিত করেছেন, আসলেই সঠিক (কারণ লক স্বয়ংক্রিয়ভাবে প্রস্থানে মেমরি বাধা বোঝায় )। যখন আপনি একাধিকবার ইনস্ট্যান্সটি ব্যবহার করেন তখন এটি এককোন # 2 এর চেয়েও দ্রুত হওয়া উচিত (যা একটি সিঙ্গলন এর বিন্দু কম বা কম): -))। সুতরাং, যদি আপনাকে সত্যিই অলস একক্টোন বাস্তবায়ন দরকার হয় তবে আমি সম্ভবত এটির জন্য যেতে চাই - সহজ কারণগুলির জন্য (1) এটি এমন প্রত্যেকের জন্য খুব স্পষ্ট যে আপনার কোডটি কী চলছে তা পড়ে এবং (2) আপনি জানেন কি হবে ব্যতিক্রম সঙ্গে।

আপনি যদি ভাবছেন যে: আমি কখনোই সিঙ্গলটন # 6 ব্যবহার করব না কারণ এটি সহজেই ব্যতিক্রমগুলির সাথে ডেডলক এবং অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে। বিস্তারিত জানার জন্য, দেখুন: অলস এর লকিং মোড , বিশেষ করে এক্সিকিউশন এবং প্রকাশ।





singleton