জোন স্কিটির স্পষ্টতা দ্বারা সিঙ্গলটন


214
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();
    }
}

আমি জে স্কিটির সিঙ্গেলটন প্যাটার্নটি আমার বর্তমান প্রয়োগে সি # তে প্রয়োগ করতে চাই।

কোডটিতে আমার দুটি সন্দেহ আছে

  1. নেস্টেড ক্লাসের অভ্যন্তরে বাইরের শ্রেণি অ্যাক্সেস করা কীভাবে সম্ভব? আমি বোঝাতে চাই

    internal static readonly Singleton instance = new Singleton();

    কিছু বলা হয় বন্ধ?

  2. আমি এই মন্তব্য বুঝতে অক্ষম

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

    এই মন্তব্যটি আমাদের কী পরামর্শ দেয়?


12
হাহা আমি ভেবেছিলাম আমি বলেছিলাম যে এটি কিছুটা চিন্তিত হ'ল ... ভিন্ন জন নোলান হিসাবে পরিণত হয়েছে
জন অ্যান্টনি ড্যানিয়েল নোলান

14
দুটি জিনিস সর্বজনস্বীকৃত: সূর্য পূর্ব থেকে উদিত হয় এবং জন স্কিটি সর্বদা সঠিক। তবে আমি এখনও পূর্বের সম্পর্কে নিশ্চিত নই: পি
আখিল_মিটাল

2
@ thepirat000 - যদি তিনি কেবলমাত্র এসও / মেটার অংশগ্রহী হন তবে আমি দ্বিমত পোষণ করতে পারি তবে প্রোগ্রামিংয়ের আসল জগতে তার যথেষ্ট প্রভাব রয়েছে যা সম্ভবত যুক্তিযুক্ত হতে পারে - আমি নিশ্চিত যে কেউ এটিকে তৈরি করেছে এক পর্যায়ে বা অন্য কোনও সময়ে has ।
কোড জকি

8
এই প্রশ্নের মেগনা নিয়ে মেটা নিয়ে আলোচনা হচ্ছে ।
বোল্টক্লক

উত্তর:


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

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

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

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

    static Singleton() {}
    private Singleton() {}
}

12
@ অনিন্দ্য: না, ঠিক আছে। আপনি যদিও অভিযোগ করতে জেটব্রেইনসকে মেইল ​​করতে চাইতে পারেন :)
জন স্কিটি

2
@ জোনস্কিট, আমি জেটব্রেইনসকে এই সম্পর্কে একটি উদ্বেগ উত্থাপন করেছি (# আরএসআরপি -274373)। আসুন দেখি তারা কীভাবে সামনে আসতে পারে। :)
অনিন্দ্য চ্যাটার্জি

3
@ মুনস: আপনি না। একটি সিঙ্গলটন অ্যাপডোমেনের সময়কালের জন্য বেঁচে থাকে।
জন স্কিটি 25'15

2
@ জোনস্কিট ব্যবহার না করার কোনও কারণ Lazy<T>যাতে আপনাকে যাদু BeforeFieldInitপার্শ্ব-প্রতিক্রিয়াটির জন্য কোনও স্ট্যাটিক কনস্ট্রাক্টর ঘোষণা করতে না হয় ?
এড টি

3
FieldBeforeInitএর MahaBharataথেকেMicrosoft
অমিত কুমার ঘোষ

49

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

    private class Nested

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

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

যে কোনও উপায়ে, আপনি যদি সিলেটলেটগুলি বাস্তবায়ন করছেন তবে আপনি চান এটি যতটা সম্ভব অলসভাবে শুরু করতে চান এবং রানটাইমটি যখন আপনার ভেরিয়েবলটি আরম্ভ করার কথা মনে করে না - বা আপনার সম্ভবত কোনও যত্ন নেই। আপনার প্রশ্ন থেকে আমি মনে করি আপনি যত তাড়াতাড়ি সম্ভব এগুলি চান।

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

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

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


62
Regarding question (1): The answer from Jon is correct ...জন স্কিটি সর্বদা সঠিক ....
নোকটিস

72
জন স্কিটি প্রশ্ন সম্পর্কে উত্তর দেওয়ার চেষ্টা করার জন্য অতিরিক্ত পয়েন্ট যা জোন স্কিটি ইতিমধ্যে উত্তর দিয়ে গেছে।
ভালদেটারো

8
@ ওয়ালদেটারো হাহাহা। এই ...
হাহাহা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.