2017-02-14 11 views
9

मैं और सिंगलटन लागू करने के लिए एक ट्यूटोरियल पढ़ रहा था कोड कहा जाता हैकौन सा पहला स्थिर निर्माता या निजी निर्माता

public class Singleton 
    { 
     private static readonly Singleton instance = new Singleton(); 

     static Singleton() 
     { 
      Console.WriteLine("Static"); 
     } 
     private Singleton() 
     { 
      Console.WriteLine("Private"); 
     } 

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

     public void DoSomething() { 
      //this must be thread safe 
     } 
    } 

है जब मैं Singleton.Instance लिखते हैं, उत्पादन

निजी
है स्टेटिक

मैं इसे उम्मीद कर रहा था होना करने के लिए

स्टेटिक
निजी

कारण किया जा रहा है कि जब मैं एक MSDN ट्यूटोरियल पढ़ें "https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx"

मैंने देखा कि सार्वजनिक निर्माता स्थिर निर्माता के बाद बुलाया गया था।

कोई अंतर क्यों है?

+0

एक सिंगलटन के लिए, आप की जरूरत नहीं है स्थिर कन्स्ट्रक्टर। ऑब्जेक्ट बनाएं और 'लॉक (ऑब्जेक्ट)' का उपयोग करके सरल थ्रेडिंग का उपयोग करें ताकि केवल एक थ्रेड आपकी विधि तक पहुंच सके। – ViVi

+0

मैंने लॉक्स के साथ शुरुआत की, और पर्याप्त दस्तावेज पढ़ा है कि वे कितने महंगे हैं। इसलिए, मैंने यह कोड चुना है। – Rajat

+0

@ViVi यह सवाल इस बारे में नहीं है कि बेहतर तरीका क्या है, लेकिन आउटपुट क्यों 'निजी स्टेटिक' है। अच्छा सवाल – CodingYoshi

उत्तर

5

वर्ग के बाहर कोड के पहले कक्षा का उपयोग कर कक्षा से पहले स्थिर कन्स्ट्रक्टर को पूरा करना होगा। लेकिन भाषा विनिर्देश को स्थिर कन्स्ट्रक्टर से पहले इंस्टेंस कन्स्ट्रक्टर को पूरा करने की अनुमति देना है, ताकि आप उदा। ऐसा करें:

static Singleton() 
{ 
    instance = new Singleton(); 
    // It has to be legal to use "instance" here 
    Console.WriteLine("Static"); 
} 

ध्यान दें कि आपके उदाहरण में, यह वही है जो वैसे भी होता है। फील्ड प्रारंभकर्ता अनिवार्य रूप से निर्माता का हिस्सा बन जाते हैं; वे बस पहले निष्पादित करते हैं।

यह उत्पन्न आईएल ने परिपुष्ट है:

// Static constructor 
Singleton..cctor: 
IL_0000: newobj  Singleton..ctor  //Calls private constructor first 
IL_0005: stsfld  Singleton.instance //to create .instance 
IL_000A: nop   
IL_000B: ldstr  "Static" 
IL_0010: call  System.Console.WriteLine 
IL_0015: nop   
IL_0016: ret   

भी देखें संबंधित (लेकिन नकल नहीं) प्रश्न और एरिक Lippert के आम तौर पर उत्कृष्ट जवाब यहाँ: एक Calling of Static Constructor and Instance Constructor

+0

का संभावित डुप्लिकेट तो यह सामान्य रूप से स्थिर कन्स्ट्रक्टर के साथ शुरू होता है , स्थिर कन्स्ट्रक्टर के अंदर इसे वैध उदाहरण की आवश्यकता है, इसलिए यह फ़ील्ड इंस्टेंस बनाने के लिए जाता है जो फिर से निजी कन्स्ट्रक्टर को कॉल करता है। स्टेटिक -> फ़ील्ड -> निजी कन्स्ट्रक्टर। क्या मैने इसे सही समझा? –

+0

@Abdul: मूल रूप से, हाँ। यह सब संकलन समय पर निर्धारित है। यह कोड की तरह नहीं है जो स्थिर रूप से स्थिर रचनाकार में गतिशील रूप से निर्धारित करता है, इसे वैध उदाहरण की आवश्यकता होती है। कोड प्राप्त करने के लिए कोड पहले से ही है। लेकिन हां, स्थिर कन्स्ट्रक्टर में फ़ील्ड को प्रारंभ करने की आवश्यकता है जो इंस्टेंस कन्स्ट्रक्टर को कॉल करने का कारण बनती है। –

संबंधित मुद्दे