Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में सिंगलटन क्लास हमेशा सील्ड (sealed) क्यों होती है

sealed कीवर्ड का अर्थ है कि क्लास से विरासत नहीं ली जा सकती। कंस्ट्रक्टर को private घोषित करने का अर्थ है कि क्लास के इंस्टेंस नहीं बनाए जा सकते।

आप एक बेस क्लास के साथ प्राइवेट कंस्ट्रक्टर रख सकते हैं, लेकिन फिर भी उस बेस क्लास से विरासत ले सकते हैं, कुछ पब्लिक कंस्ट्रक्टर परिभाषित कर सकते हैं, और प्रभावी रूप से उस बेस क्लास को इंस्टेंटिएट कर सकते हैं।

कंस्ट्रक्टर विरासत में नहीं मिलते (इसलिए डेराइव्ड क्लास के पास केवल इसलिए सभी प्राइवेट कंस्ट्रक्टर नहीं होंगे क्योंकि बेस क्लास के पास हैं), और डेराइव्ड क्लासेस हमेशा पहले बेस क्लास कंस्ट्रक्टर को कॉल करती हैं।

क्लास को sealed मार्क करने से कोई आपकी सावधानीपूर्वक निर्मित सिंगलटन क्लास को तुच्छ तरीके से बायपास नहीं कर सकता क्योंकि यह किसी को क्लास से विरासत लेने से रोकता है।

उदाहरण: सील्ड के बिना सिंगलटन (भेद्य)

static class Program
{
    static void Main(string[] args)
    {
        Singleton fromStudent = Singleton.GetInstance;
        fromStudent.PrintDetails("From Student");

        Singleton fromEmployee = Singleton.GetInstance;
        fromEmployee.PrintDetails("From Employee");

        Console.WriteLine("-------------------------------------");

        // समस्या: कोई DerivedSingleton बना सकता है और नए इंस्टेंस बना सकता है!
        Singleton.DerivedSingleton derivedObj = new Singleton.DerivedSingleton();
        derivedObj.PrintDetails("From Derived");

        Console.ReadLine();
    }
}

public class Singleton
{
    private static int counter = 0;
    private static object obj = new object();
    
    private Singleton()
    {
        counter++;
        Console.WriteLine("Counter Value " + counter.ToString());
    }

    private static Singleton instance = null;

    public static Singleton GetInstance
    {
        get
        {
            if (instance == null)
                instance = new Singleton();
            return instance;
        }
    }

    public void PrintDetails(string message)
    {
        Console.WriteLine(message);
    }

    // समस्या: नेस्टेड क्लास विरासत ले सकती है और नए इंस्टेंस बना सकती है!
    public class DerivedSingleton : Singleton { }
}

आउटपुट (सील्ड के बिना)

Counter Value 1
From Student
From Employee
-------------------------------------
Counter Value 2        <-- नया इंस्टेंस बना! सिंगलटन टूटा!
From Derived

सही कार्यान्वयन: सील्ड सिंगलटन

// थ्रेड-सेफ, सील्ड सिंगलटन
public sealed class Singleton
{
    private static readonly Lazy<Singleton> _instance = 
        new Lazy<Singleton>(() => new Singleton());

    private Singleton() { }

    public static Singleton Instance => _instance.Value;

    public void DoSomething() { Console.WriteLine("Singleton working"); }
}

// उपयोग
var s1 = Singleton.Instance;
var s2 = Singleton.Instance;
Console.WriteLine(s1 == s2); // True

सील्ड सिंगलटन के फायदे

  • विरासत रोकता है: कोई उपक्लास नहीं बना सकता
  • JIT ऑप्टिमाइज़ेशन: सील्ड क्लासेस पर वर्चुअल कॉल्स को देवर्चुअलाइज़ किया जा सकता है
  • स्पष्ट इरादा: डिज़ाइन स्पष्ट रूप से बताता है "यह क्लास एक्सटेंशन के लिए नहीं है"
  • सुरक्षा: दुर्भावनापूर्ण या आकस्मिक उपवर्गीकरण को रोकता है

आधुनिक C# में सिंगलटन के विकल्प

// 1. Lazy<T> (थ्रेड-सेफ, आलसी)
public sealed class Singleton 
{ 
    private static readonly Lazy<Singleton> _instance = new(() => new Singleton());
    private Singleton() { }
    public static Singleton Instance => _instance.Value;
}

// 2. Static क्लास (यदि कोई स्थिति नहीं)
public static class Logger { public static void Log(string msg) { ... } }

// 3. DI कंटेनर में पंजीकरण (अनुशंसित)
services.AddSingleton<IService, ServiceImpl>();

सारांश

sealed सिंगलटन पैटर्न की अखंडता सुनिश्चित करता है विरासत को रोककर, जो अन्यथा एकाधिक इंस्टेंस बनाने और पैटर्न को तोड़ने की अनुमति देगा।
  1. Android में सिंगलटन क्लास का उपयोग कैसे करें? Android में सिंगलटन क्लास का उपयोग कैसे करें?

    सिंगलटन डिज़ाइन पैटर्न सिंगलटन एक डिज़ाइन पैटर्न है जो किसी क्लास के इंस्टेंशिएशन को केवल एक इंस्टेंस तक सीमित करता है। यह कंकरेंसी नियंत्रण और डेटा स्टोर तक केंद्रीय पहुंच प्रदान करने के लिए उपयोगी है। उदाहरण: डेटा स्टोरेज के लिए सिंगलटन क्लास यह उदाहरण दर्शाता है कि सिंगलटन क्लास में टेक्स्ट डेटा

  1. C# में Console क्लास C# में Console क्लास

    C# में Console क्लास का उपयोग कंसोल एप्लिकेशन के लिए मानक इनपुट, आउटपुट और त्रुटि स्ट्रीम को दर्शाने के लिए किया जाता है। आइए C# में Console क्लास प्रॉपर्टीज के कुछ उदाहरण देखते हैं: Console.CursorLeft प्रॉपर्टी C# में कंसोल का CursorLeft बदलने के लिए Console.CursorLeft प्रॉपर्टी का उपयोग करें। उदा

  1. प्रोग्रामिंग में क्लासेस का महत्व: कोड व्यवस्थित करना और अमूर्तता बढ़ाना प्रोग्रामिंग में क्लासेस का महत्व: कोड व्यवस्थित करना और अमूर्तता बढ़ाना

    मेरे पिछले लेख के बाद, हम nil का उपयोग क्यों करते हैं, मुझे लगा कि अन्य चीजों के लिए भी यह सवाल पूछना एक अच्छा विचार होगा जिन्हें हम स्वाभाविक मान लेते हैं। जैसे… हम केवल एक विशाल बदसूरत कोड के ब्लॉब के बजाय क्लासेस का उपयोग क्यों करते हैं? एक मौलिक स्तर पर, हम कोड और डेटा को तार्किक इकाइयों में व्य