जब मेरे पास स्टैटिक कंस्ट्रक्टर वाली क्लास होती है, तो क्या उस कंस्ट्रक्टर को तब बुलाया जाता है, जब क्लास वाली असेंबली को पहले लोड किया जाता है या जब उस क्लास का पहला रेफरेंस हिट होता है?
जवाबों:
जब पहली बार कक्षा में प्रवेश किया जाता है।
स्टेटिक कंस्ट्रक्टर्स (C # प्रोग्रामिंग गाइड)
किसी स्थिर डेटा को इनिशियलाइज़ करने के लिए या केवल एक बार किए जाने वाले किसी विशेष कार्य को करने के लिए एक स्टैटिक कंस्ट्रक्टर का उपयोग किया जाता है। पहला उदाहरण बनने से पहले इसे स्वचालित रूप से कहा जाता है या किसी भी स्थिर सदस्यों को संदर्भित किया जाता है।
A static constructor is used to initialize any static data
नहीं। static initializer
स्थैतिक सामान को इनिशियलाइज़ करने के लिए बेहतर है ।
यह उतना सरल नहीं है जितना कि आप सीधे प्रलेखन के बावजूद उम्मीद कर सकते हैं। जॉन स्कीट का लेख http://csharpindepth.com/Articles/General/Beforefieldinit.aspx विवरण में इस प्रश्न पर जाता है।
सारांश:
स्टेटिक कंस्ट्रक्टर को उस वर्ग के किसी सदस्य के पहले संदर्भ से तुरंत पहले निष्पादित करने की गारंटी दी जाती है - या तो उदाहरण या स्वयं की स्थैतिक विधि / वर्ग की संपत्ति का निर्माण।
ध्यान दें कि किसी विशेष क्षेत्र के पहले संदर्भ में किसी भी समय निष्पादित होने की गारंटी देने वाले स्थिर initilaizers (यदि कोई स्थिर निर्माता नहीं है) ।
क्लास में कुछ भी इस्तेमाल करने से पहले स्टैटिक कंस्ट्रक्टर को बुलाया जाता है, लेकिन वास्तव में ऐसा तब होता है जब इसे लागू करना होता है।
पहले स्थैतिक सदस्य तक पहुँचने से पहले और पहली बार निर्मित होने से पहले इसे कॉल करने की गारंटी है। यदि वर्ग का उपयोग कभी नहीं किया जाता है, तो स्थिर निर्माणकर्ता को कॉल करने की गारंटी नहीं दी जाती है।
अगर स्टैटिक मेथड को पैरेंट क्लास से पुकारा जाता है, तो स्टैटिक कंस्ट्रक्टर को नहीं बुलाया जाएगा, हालांकि यह स्पष्ट रूप से निर्दिष्ट है। यहाँ एक उदाहरण 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
}
}
ऐसा लगता है कि स्थैतिक निर्माणकर्ताओं के साथ एक गोत्र है, जिसका उत्तर कहीं और दिया गया है, लेकिन एक सरल व्याख्या में पचने में थोड़ा समय लगता है। सभी डॉक्स और स्पष्टीकरण स्टैटिक कंस्ट्रक्टर / इंटेस्टाइज़र का दावा करते हैं कि प्रथम श्रेणी के त्वरित होने से पहले चलने के लिए "गारंटी" है या पहले स्थिर क्षेत्र को संदर्भित किया जाता है। गेटचा तब आता है जब आप क्लास में एक स्टैटिक सिंगलटन डालने की कोशिश करते हैं जो स्वयं (चिकन / अंडा) का एक उदाहरण बनाता है। इस मामले में स्थिर कंस्ट्रक्टर समाप्त हो जाता है जिसे इंस्टेंस कंस्ट्रक्टर के बाद कहा जाता है - और मेरे मामले में इंस्टेंस कंस्ट्रक्टर में कुछ स्थिर डेटा पर निर्भर कोड समाहित है।
इंस्टेंट कंस्ट्रक्टर को इंस्टेंट कंस्ट्रक्टर के बाद कहा जाता है?
स्टेटिक कंस्ट्रक्टर नॉन-स्टैटिक कंस्ट्रक्टर के बाद चल सकता है। क्या यह एक कंपाइलर बग है?
(मेरे लिए जवाब एकल वर्ग को अलग वर्ग में रखना था या मैन्युअल रूप से इंस्टेंस कंस्ट्रक्टर में स्थैतिक डेटा को प्रारंभ करने से पहले आवश्यक है)