2012-03-16 11 views
5

के साथ सिंगलटन कार्यान्वयन मैं निम्नलिखित सिंगलटन कार्यान्वयन के माध्यम से here का उल्लेख कर रहा था। मैं समझता हूं कि स्थैतिक रचनाकारों को पहली स्थिर विधि कॉल से पहले या टी ऑब्जेक्ट को तत्काल करने से पहले निष्पादित किया जाता है, लेकिन यहां इसका उपयोग (टिप्पणियों से भी) को समझ में नहीं आया। क्या कोई इसे समझने में मेरी सहायता कर सकता है?रिक्त स्थिर कन्स्ट्रक्टर

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

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    private Singleton() 
    { 
    } 

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

यह इसके नीचे बुलेट बिंदुओं में समझाया गया है, विशेष रूप से: 'टाइप प्रारंभकर्ताओं की आलस्य केवल .NET द्वारा गारंटीकृत होती है जब प्रकार को' prefieldinit 'नामक विशेष ध्वज के साथ चिह्नित नहीं किया जाता है। दुर्भाग्यवश, सी # कंपाइलर (जैसा कि कम से कम .NET 1.1 रनटाइम में प्रदान किया गया है) उन सभी प्रकारों को चिह्नित करता है जिनमें स्थिर कंस्ट्रक्टर नहीं है (यानी एक ब्लॉक जो एक कन्स्ट्रक्टर की तरह दिखता है लेकिन स्थैतिक चिह्नित है) 'prefieldinit' के रूप में। 'तो , वह चाहता है कि 'नया सिंगलटन() 'जितना संभव हो सके (आलसी) बनाया जाए, और ऐसा करने के लिए सी # कंपाइलर प्राप्त करने का एकमात्र तरीका एक खाली स्थैतिक कन्स्ट्रक्टर प्रदान करना है। – porges

+0

मेरी अज्ञानता को क्षमा करें। "प्रारंभिक प्रकार की आलस्य" क्या है। यह पहला अनुरोध पर प्रारंभिक है? – Nemo

+0

बिल्कुल। यह केवल उस स्थिति में गारंटीकृत है, अन्यथा रनटाइम जब भी चाहें टाइप प्रारंभकर्ताओं को चला सकता है, जैसे जैसे ही प्रकार लोड हो जाता है। एक लंबे स्पष्टीकरण के लिए जय के जवाब में लिंक देखें। – porges

उत्तर

7

स्थिर निर्माता नहीं वहाँ के क्रम में है कि यह पहले या बाद में कुछ और कहा जाना चाहिए, केवल एक तरह से संकलक नहींbeforefieldinit ध्वज सेट बनाने के लिए के रूप में है। यह यहाँ पर

अधिक जानकारी: What does beforefieldinit flag do?

औचित्य सिंगलटन वस्तु के प्रारंभ में आलस्य का एक उपाय प्राप्त करने के लिए है। यदि beforefieldinit सेट किया गया है (क्योंकि कोई स्थैतिक कन्स्ट्रक्टर परिभाषित नहीं किया गया है), तो उस विधि को निष्पादित करना जो सशर्त रूप से संदर्भ Singleton.Instance को सिंगलटन ऑब्जेक्ट, प्रारंभ करने की संभावना है, भले ही स्थिति संतुष्ट न हो और वह कॉल कभी नहीं बनाया गया हो।

public void Foo() 
{ 
    if (false) 
    { 
     var bar = Singleton.Instance.SomeMethod(); 
    } 
} 

दूसरी ओर, यदि beforefieldinit सेट नहीं है (क्योंकि एक स्थिर निर्माता परिभाषित किया गया है - भले ही रिक्त), तो क्रियान्वित है कि एक ही विधि केवल कारण होगा सिंगलटन उदाहरण हालत यदि प्रारंभ करने के लिए संतुष्ट है और वह कॉल वास्तव में बनाया गया है।

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

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