2013-07-03 10 views
7

जैसा कि आप मेरे उपनाम से देख सकते हैं मैं वास्तव में सिंगलटन पैटर्न के बारे में सीख रहा हूं, जहां मुझे एक समस्या है। इससे पहले कि मैंने सीखा है कि मानक रचनाकारों को मानक कन्स्ट्रक्टर से पहले हमेशा निष्पादित किया जाता है, लेकिन नीचे दिए गए कोड में, परिणाम अलग होता है, पहले मैं "इंस्टा" स्ट्रिंग को "स्टेटिक" देखता हूं, ऐसा क्यों होता है?सी # - सिंगलटन पैटर्न

sealed class Singleton 
{ 
    private static readonly Singleton instance; 

    private Singleton() 
    { 
     Console.WriteLine("Insta"); 
    } 

    static Singleton() 
    { 
     instance = new Singleton(); 
     Console.WriteLine("Static"); 
    } 

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

class Program 
{ 
    static void Main() 
    { 
     Singleton s1 = Singleton.Instance; 

    } 

} 
+2

संबंधित: - "स्थिर निर्माता पहले बुलाया" http://csharpindepth.com/Articles/General/Singleton.aspx – jbabey

+1

आपकी अपेक्षाओं के तर्क पर सुनिश्चित नहीं हैं इसका मतलब यह नहीं है कि "क्लास कन्स्ट्रक्टर में सभी कोड क्लासिक सदस्यों को सभी कॉल से पहले जादुई रूप से निष्पादित किया गया" (उदाहरण के लिए आपके मामले में कन्स्ट्रक्टर)। –

उत्तर

13

आप

static Singleton() 
{ 
    Console.WriteLine("Static"); //THIS COMES FIRST 
    instance = new Singleton(); 

} 

लिखेंगे तो आप आप क्या उम्मीद देखना होगा

स्थिर ctor, पहली बार में मार डाला जाता है के रूप में उम्मीद है, लेकिन आप instance = new Singleton(); पंक्ति के बाद सांत्वना पर प्रिंट , लेकिन यह लाइन निष्पादन उदाहरण ctor, तो "inst"।

तो निष्पादन प्रवाह:

  • स्थिर ctor
    • instance = new Singleton();
      • उदाहरण ctor प्रिंट "इंस्टा"
    • "स्थिर"
+0

मेरी गलती ठीक है, धन्यवाद। लेकिन मेरे पास एक और पूछना है कि क्या मैं "निजी स्थैतिक रीडोनली सिंगलटन इंस्टेंस = नया सिंगलटन() लिखता हूं;" क्या संकलक इस अभिव्यक्ति को स्थैतिक सीटीआर में ले जाएगा या क्या? – CSharpBeginner

+0

@CSharpBeginner no, सिंगलटन इंस्टेंस का निर्माण पहली बार कक्षा के रूप में किया जाएगा, आपको अब स्थिर कन्स्ट्रक्टर – konkked

+0

की आवश्यकता नहीं होगी, इसलिए यह प्रारंभिक कार्य उसी तरह काम करता है जैसे स्थिर सीटीआर सही करता है? – CSharpBeginner

8

सिंगलटन पैटर्न की गुणवत्ता स्पष्टीकरण के लिए MSDN pattern here देखें।

MSDN सिफारिश की गई है आप नीचे के रूप में यह लिखना चाहिए तो यह धागा सुरक्षित है:

इन्स्टेन्शियशन एक जब तक नहीं किया जाता है:

using System; 

public sealed class Singleton 
{ 
    private static volatile Singleton instance; 
    private static object syncRoot = new Object(); 

    private Singleton() {} 

    public static Singleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      lock (syncRoot) 
      { 
       if (instance == null) 
        instance = new Singleton(); 
      } 
     } 

     return instance; 
     } 
    } 
} 

वैसे, इस पैटर्न स्थिर निर्माता पर निम्नलिखित लाभ दिया है ऑब्जेक्ट एक उदाहरण के लिए पूछता है; इस दृष्टिकोण को आलसी तात्कालिकता के रूप में जाना जाता है। आलसी तात्कालिकता एप्लिकेशन शुरू होने पर अनावश्यक सिंगलेट्स को तुरंत चालू करने से बचाती है।

देखें कि यह आपकी आवश्यकताओं को पूरा करता है, और यदि ऐसा है, तो इस समाधान को लागू करें।

+2

थ्रेड सुरक्षा को इस तरह के वैचारिक प्रश्न के साथ क्या करना है? – Raptor

+2

मेरा बिंदु एक सिंगलटन समाधान को कार्यान्वित करने के तरीके में एमएसडीएन आलेख प्रस्तुत करना है।पहिया को फिर से शुरू करने की कोई ज़रूरत नहीं है। चूंकि वह एक नौसिखिया है, इसलिए एक विशिष्ट पैटर्न को पढ़ने और समझने के लिए एक अच्छा ठोस लेख होना हमेशा अच्छा होता है। – saamorim

+0

@saamorim: प्रतिलिपि कॉपी करें। एमएसडीएन शब्दों और कोड की प्रतिलिपि बनाना – Learner

1

स्थैतिक विधि पहले लागू की जाती है। यहाँ सबूत है - निम्नलिखित के लिए अपने कोड बदलने के लिए:

static Singleton() 
    { 
     Console.WriteLine("Static method start"); 
     instance = new Singleton(); 
     Console.WriteLine("Static method end"); 
    } 
संबंधित मुद्दे