2009-09-17 19 views
69

जब मेरे पास एक स्थिर कन्स्ट्रक्टर वाला वर्ग होता है, तो क्या वह कन्स्ट्रक्टर कहलाता है जब कक्षा वाले असेंबली को पहली बार लोड किया जाता है या जब उस वर्ग का पहला संदर्भ मारा जाता है?सी # में एक स्थिर कन्स्ट्रक्टर कब कहा जाता है?

उत्तर

79

जब कक्षा पहली बार पहुंच जाती है।

Static Constructors (C# Programming Guide)

एक स्थिर निर्माता किसी भी स्थिर डेटा प्रारंभ करने, या किसी ख़ास कार्य है कि एक बार ही किया जाता जरूरत प्रदर्शन करने के लिए प्रयोग किया जाता है। इसे पहले उदाहरण के निर्माण से पहले स्वचालित रूप से कहा जाता है या किसी स्थिर सदस्यों का संदर्भ दिया जाता है।

+0

धन्यवाद, यह समझ में आता है जब मैं इसके बारे में ठीक से सोचता हूं! – Jason

+5

दिलचस्प है कि यह कहता है "पहले उदाहरण बनने से पहले या किसी स्थिर सदस्यों का संदर्भ दिया जाता है"। * जब * वास्तव में इसे बुलाया जाता है तो वहां कुछ छूट होती है। –

+5

@TimBarrass विनिर्देश की कुछ अन्य आवश्यकताओं के कारण यह पता चला है कि "पहले" वास्तव में "तुरंत" है - जॉन स्कीट के लेख को अन्य उत्तरों में संदर्भित किया गया है - http://stackoverflow.com/a/1437372/477420 –

34

यह उतना आसान नहीं है जितना आप सीधे दस्तावेज़ीकरण के बावजूद अपेक्षा कर सकते हैं। जॉन स्कीट का लेख http://csharpindepth.com/Articles/General/Beforefieldinit.aspx विवरण में इस प्रश्न में जाता है।

सारांश:

स्टेटिक निर्माता है कि वर्ग के एक सदस्य का पहला संदर्भ से ठीक पहलेनिष्पादित करने की गारंटी दी गई है - या तो उदाहरण या खुद स्थिर विधि/वर्ग की संपत्ति का निर्माण।

ध्यान दें कि स्थिर इनिटिलाइज़र (यदि कोई स्थैतिक कन्स्ट्रक्टर नहीं है) किसी भी समय निष्पादित करने की गारंटी देता है, विशेष फ़ील्ड के पहले संदर्भ से पहले।

+0

+1। मुझे बस मारो, केवल तभी। ;) – AnthonyWJones

+0

यह बहुत दिलचस्प है, शुक्रिया धन्यवाद। – Jason

+0

उल्लेख किया गया लेख अब जॉन स्कीट की साइट पर है: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx – dotnetguy

17

कक्षा में कुछ भी उपयोग करने से पहले स्थैतिक कन्स्ट्रक्टर को बुलाया जाता है, लेकिन जब ऐसा होता है तो कार्यान्वयन तक होता है।

पहले स्थिर सदस्य का उपयोग करने से पहले और पहले उदाहरण के निर्माण से पहले इसे कॉल करने की गारंटी है। यदि कक्षा का कभी भी उपयोग नहीं किया जाता है, तो स्थिर कन्स्ट्रक्टर को बिल्कुल कॉल करने की गारंटी नहीं है।

+2

जब ऐसा होता है * * कार्यान्वयन तक नहीं है "यदि कार्यान्वयन ईसीएमए सी # spec का पालन करता है:" एक स्थिर कन्स्ट्रक्टर का निष्पादन निम्न डोमेन के अनुप्रयोगों के भीतर होने वाली घटनाओं में से पहला होता है: [1] An वर्ग का उदाहरण बनाया गया है। [2] कक्षा के किसी भी स्थिर सदस्य का संदर्भ दिया जाता है। " (धारा 17.11, http://www.ecma-international.org/publications/standards/Ecma-334.htm) – LukeH

+0

@ ल्यूक: "स्थैतिक कन्स्ट्रक्टर निष्पादन का सटीक समय कार्यान्वयन-निर्भर है" http://ondotnet.com/पब/एक/डॉटनैट/2003/07/07/staticxtor।एचटीएमएल – Guffa

+2

@ गुफा: यह लेख लेखक की व्याख्या हो सकती है, लेकिन आपको सी # spec के माइक्रोसॉफ्ट या ईसीएमए/आईएसओ संस्करणों में यह शब्द नहीं मिलेगा। – LukeH

0

यदि मूल वर्ग से स्थैतिक विधि को बुलाया जाता है, तो स्थैतिक कन्स्ट्रक्टर को नहीं कहा जाएगा, althogh यह स्पष्ट रूप से निर्दिष्ट है। यहां एक उदाहरण बी कन्स्ट्रक्टर नहीं कहा जाता है यदि b.methoda() कहा जाता है।

static void Main(string[] args) 
{ 
    b.methoda(); 
} 

class a 
{ 
    public static void methoda() 
    { 
     //using initialized method data 
    } 
} 

class b : a 
{ 
    static b() 
    { 
     //some initialization 
    } 
}  
संबंधित मुद्दे