2017-02-15 15 views
12

"सी # भाषा विशिष्टता" संस्करण 5.0 के "10.12 स्टेटिक कंस्ट्रक्टर" खंड के अनुसार "स्थिर" संशोधक को "बाहरी" संशोधक के साथ चिह्नित किया जा सकता है और इस मामले में इसे बाह्य स्थैतिक कन्स्ट्रक्टर कहा जाता है।सी # में बाहरी स्थिर रचनाकारों का उद्देश्य क्या है?

सामान्य (गैर-बाहरी) स्थैतिक रचनाकार अच्छी तरह से जाने जाते हैं। वे स्थिर क्षेत्रों और गुणों को शुरू करने के लिए उपयोग किया जाता है।

बाहरी स्थैतिक विधियों को अक्सर पी/Invoke के माध्यम से देशी कार्यों को कॉल करने के लिए उपयोग किया जाता है।

और मुझे काफी गूढ़ बाहरी रचनाकारों के बारे में भी पता है (this question भी देखें)। उदाहरण के लिए, String कक्षा में ऐसे declarations हैं, इन रचनाकारों को रनटाइम द्वारा कार्यान्वित किया जाता है।

लेकिन क्या बाहरी स्थिर रचनाकारों का कोई वास्तविक उपयोग है? मैंने coreclr repo के माध्यम से खोज की है और कुछ भी नहीं मिला है। भाषा विनिर्देश कुछ ऐसे निर्माणों का विवरण नहीं दे सका जो जंगली में कभी भी उपयोग नहीं किया गया है। या कर सकता था?

मेरा अनुमान है: सी # में बाहरी स्थैतिक रचनाकार हैं क्योंकि सीएलआर उनका समर्थन करता है (सिद्धांत रूप में)।

+0

मुझे लगता है कि आपको 10.6 (विधि) से 10.13 (विध्वंसक) से धारा 10 के प्रत्येक उपधारा में पाठ का एक बहुत ही समान हिस्सा मिल जाएगा। यदि कुछ और नहीं, कम से कम यह * सुसंगत * है। –

+1

एकमात्र चीज 'बाहरी' करता है विधि के आरवीए को 0 पर सेट किया जाता है। रनटाइम बाकी को जानने के लिए छोड़ दिया जाता है। Http://stackoverflow.com/q/38015024/ भी देखें। भाषा spec के लिए इसे कम करने का कोई कारण नहीं है क्योंकि संकलक के काम तुच्छ है (यह इसे अधिक करने के लिए और अधिक काम करेगा)। इसके अलावा, चूंकि रचनाकारों को 'DllImport' चिह्नित नहीं किया जा सकता है, इसलिए इस तरह के तरीकों को लागू करने का एकमात्र तरीका 'MethodImplOptions.InternalCall' के साथ है, इसलिए रनटाइम एकमात्र संभावित उपभोक्ता है, जिससे इसे स्पष्ट रूप से प्रतिबंधित करने के लिए भी कम दिलचस्प बना दिया जाता है। –

+0

क्यों वे वास्तव में उपयोग नहीं किए जाते हैं, यह अटकलों के दायरे में जाता है, लेकिन अगर मैं एक सीएलआर कार्यान्वयनकर्ता था, तो मैं बजाय आर्केन नियमों पर भरोसा करने के बजाय स्पॉट्स की भविष्यवाणी करने में आसानी से अपना स्थिर प्रारंभ करना पसंद करूंगा स्थिर प्रकार के प्रारंभ के लिए। वह सभी कोड रनटाइम में वापस कॉल करता है, इसलिए यह कुछ भी नहीं करेगा लेकिन मेरी नौकरी को कठिन बना देगा। –

उत्तर

1

MSDN से:

जब एक निर्माता घोषणा एक निर्वासन संशोधक भी शामिल है, निर्माता एक बाहरी निर्माता होना कहा जाता है। चूंकि बाहरी कन्स्ट्रक्टर घोषणा कोई वास्तविक कार्यान्वयन प्रदान नहीं करती है, इसके कन्स्ट्रक्टर-बॉडी में अर्धविराम होता है।

...

ऐसा लगता है कि हम सुनिश्चित करें कि सही इस घोषणा और यह उपयोग करने का एक अच्छा कारण के बारे में सोच नहीं कर सकते। लेकिन जब आप आगे खोदते हैं तो आपको एहसास होता है कि गतिशील संयोजन की पूरी दुनिया है या - कोड जनरेशन।

यदि आप .NET प्लेटफ़ॉर्म के लिए एक कंपाइलर विकसित करना चाहते हैं तो आपको शायद कुछ ट्रिकरी समाधानों की आवश्यकता होगी जैसे सी # कंपाइलर उपयोग करता है। मुझे एहसास हो सकता है कि कुछ मूल कार्यान्वयन बाहरी कन्स्ट्रक्टर का उपयोग करते हैं जो अच्छे डिजाइन कारणों के लिए कहीं और लागू किया जाता है।

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