2012-02-17 14 views
12

मुझे विश्वास नहीं है कि जेनरेट कोड यह जांच करेगा कि क्लास को हर बार जब यह एक स्थिर सदस्य (जिसमें फ़ंक्शंस शामिल है) तक पहुंच जाती है। मेरा मानना ​​है कि हर पहुंच की जांच अक्षम होगी। मैं ECMA 334 में §17.11 को देखा और यह कहते हैंसी # कैसे एक स्थिर कन्स्ट्रक्टर चलाने के लिए पता है?

एक स्थिर निर्माता के निष्पादन के लिए एक आवेदन डोमेन के भीतर होने की निम्न इवेंट के पहले से शुरू हो रहा है:

  • का एक उदाहरण वर्ग बनाया गया है।
  • कक्षा के किसी भी स्थिर सदस्य का संदर्भ दिया जाता है।

ऐसा लगता है कि 'पहला' होता है जब परिभाषित नहीं किया जाता है। मैं ऐसा करने के किसी भी तरीके से नहीं सोच सकता लेकिन हर बार जांच कर सकता हूं। यह कैसे किया जा सकता है?

+3

संबंधित मामले के लिए संबंधित: http://csharpindepth.com/Articles/General/Beforefieldinit.aspx - यह गैर-तुच्छ –

+0

है, यह पहले के बाद किसी भिन्न स्थान पर फ़ंक्शन पॉइंटर सेट करने का सवाल नहीं है कहते हैं? सबसे पहले यह वर्ग लोडर या जो भी हो, उसके बाद समारोह के शरीर पर इंगित करता है ... – user1096188

+1

@Marc: स्थैतिक कन्स्ट्रक्टर को कॉल करते समय चर्चा करता है इससे पहले कि एक स्थिर सदस्य की पहली पहुंच की अनुमति है, न कि पहली पहुंच कैसे प्राप्त की जाती है । –

उत्तर

5

जब आप रनटाइम पर कोड उत्पन्न कर रहे हैं, तो आपके पास बहुत सारे विकल्प हैं। आप एक नल फ़ंक्शन पॉइंटर को कॉल कर सकते हैं, एक्सेस उल्लंघन को पकड़ सकते हैं, स्थिर कन्स्ट्रक्टर चला सकते हैं, प्रॉपर्टी गेटर संकलित कर सकते हैं, फ़ंक्शन पॉइंटर अपडेट कर सकते हैं और जारी रख सकते हैं। या संपत्ति गेटटर एक सहायक समारोह को कॉल करता है जो स्थैतिक कन्स्ट्रक्टर चलाता है और सहायक फ़ंक्शन कॉल के बिना गेटर कोड को फिर से लिखता है। या प्रत्येक स्थिर सदस्य पहुंच पर एक चेक डालें, जब चेक को हटाए गए कॉलिंग फ़ंक्शन को रीकंपाइल करता है।

16

जब आपको हल करने में कोई समस्या हो, तो एक अच्छी तकनीक है: एक कठिन समस्या हल करें, जैसे कि आपकी छोटी समस्या का समाधान कठिन समस्या के समाधान से हल हो जाता है।

सीएलआर को हल करने में बहुत कठिन समस्या है: इसे पहली बार विधि कहने से ठीक पहले प्रत्येक विधि पर एक बार जिटर चलाने के लिए है। यदि सीएलआर उस समस्या को हल कर सकता है, तो यह स्पष्ट रूप से तुलनात्मक रूप से तुच्छ उप-समस्या को हल कर सकता है जब एक स्थिर ctor को चलाने की आवश्यकता होती है।

शायद आपका प्रश्न तब होना चाहिए कि "जिटर को पहली बार विधि को कैसे जुटाना है?"

+0

दिलचस्प। मैंने अभी तक गैर एम्बेडेड सिस्टम पर जेआईटी को अभी भी सब कुछ जब्त कर लिया है और नए डीएलएस लोड करने के लिए खड़ा है। मैंने लगता है कि एम्बेडेड सिस्टम समय जटिलता से पहले उपयोग करते हैं। खराब धारणा विशेष रूप से जब बड़ा कोड खेलने में आता है। विचारों के लिए +1 –

+1

@ एसिडज़ॉम्बी 24 वास्तव में, कुछ एम्बेडेड सिस्टम जेआईटी/एओटी ** नहीं ** ** - माइक्रो फ्रेमवर्क एक आईएल दुभाषिया है (उंगलियों को पार करता है कि मुझे यह पिछला नहीं मिला है ...) –

+0

और कुछ जैसे सिस्टमनेट कॉम्पैक्ट फ्रेमवर्क जेआईटी केवल बुनियादी चीजें उदा। संपत्ति प्राप्त करें एक फ़ंक्शन कॉल –

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