C # में स्थिर निर्माणकर्ता को कब कहा जाता है?


88

जब मेरे पास स्टैटिक कंस्ट्रक्टर वाली क्लास होती है, तो क्या उस कंस्ट्रक्टर को तब बुलाया जाता है, जब क्लास वाली असेंबली को पहले लोड किया जाता है या जब उस क्लास का पहला रेफरेंस हिट होता है?

जवाबों:


93

जब पहली बार कक्षा में प्रवेश किया जाता है।

स्टेटिक कंस्ट्रक्टर्स (C # प्रोग्रामिंग गाइड)

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


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

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

A static constructor is used to initialize any static dataनहीं। static initializerस्थैतिक सामान को इनिशियलाइज़ करने के लिए बेहतर है ।
योषा अलाय्यूब

41

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

सारांश:

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

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


जॉन स्केट की साइट पर उल्लिखित लेख अब है: csharpindepth.com/Articles/General/Beforefieldinit.aspx
सुधांशु मिश्रा

निम्नलिखित प्रश्न stackoverflow.com/questions/32525628/… "तत्काल" व्यवहार के स्पष्ट होने पर मामला प्रदर्शित करता है।
एलेक्सी लेवेनकोव

1
मेरे पास वास्तव में सिर्फ एक मामला था जहां एक सांत्वना एप्लिकेशन के मुख्य विधि से पहले एक स्थिर निर्माणकर्ता को बुलाया गया था, यहां तक ​​कि निष्पादन भी शुरू हुआ!
हेरपडेरपिंगटन

19

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

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


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

1
@Luke: "स्थिर निर्माता निष्पादन का सही समय कार्यान्वयन पर निर्भर है" ondotnet.com/pub/a/dotnet/2003/07/07/staticxtor.html
Guffa

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

1

अगर स्टैटिक मेथड को पैरेंट क्लास से पुकारा जाता है, तो स्टैटिक कंस्ट्रक्टर को नहीं बुलाया जाएगा, हालांकि यह स्पष्ट रूप से निर्दिष्ट है। यहाँ एक उदाहरण b कंस्ट्रक्टर को नहीं कहा जाता है यदि 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
    }
}    

1

ऐसा लगता है कि स्थैतिक निर्माणकर्ताओं के साथ एक गोत्र है, जिसका उत्तर कहीं और दिया गया है, लेकिन एक सरल व्याख्या में पचने में थोड़ा समय लगता है। सभी डॉक्स और स्पष्टीकरण स्टैटिक कंस्ट्रक्टर / इंटेस्टाइज़र का दावा करते हैं कि प्रथम श्रेणी के त्वरित होने से पहले चलने के लिए "गारंटी" है या पहले स्थिर क्षेत्र को संदर्भित किया जाता है। गेटचा तब आता है जब आप क्लास में एक स्टैटिक सिंगलटन डालने की कोशिश करते हैं जो स्वयं (चिकन / अंडा) का एक उदाहरण बनाता है। इस मामले में स्थिर कंस्ट्रक्टर समाप्त हो जाता है जिसे इंस्टेंस कंस्ट्रक्टर के बाद कहा जाता है - और मेरे मामले में इंस्टेंस कंस्ट्रक्टर में कुछ स्थिर डेटा पर निर्भर कोड समाहित है।

इंस्टेंट कंस्ट्रक्टर को इंस्टेंट कंस्ट्रक्टर के बाद कहा जाता है?

स्टेटिक कंस्ट्रक्टर नॉन-स्टैटिक कंस्ट्रक्टर के बाद चल सकता है। क्या यह एक कंपाइलर बग है?

(मेरे लिए जवाब एकल वर्ग को अलग वर्ग में रखना था या मैन्युअल रूप से इंस्टेंस कंस्ट्रक्टर में स्थैतिक डेटा को प्रारंभ करने से पहले आवश्यक है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.