मार्क का जवाब विस्तारित, स्थानीय परिवर्तनीय प्रारंभिक सत्यापन प्रक्रिया से भी संबंधित है।
CLI की आवश्यकता है कि किसी भी निरीक्षण कोड में (जो है, मॉड्यूल कि स्पष्ट रूप से सत्यापन प्रक्रिया को छोड़ने के लिए SecurityPermission विशेषता से SkipVerfication संपत्ति का उपयोग कर पूछा नहीं था), सभी स्थानीय चर इससे पहले कि वे उपयोग कर रहे हैं प्रारंभ किया जाना चाहिए। ऐसा करने में विफल होने के परिणामस्वरूप VerficationException फेंक दिया जाएगा।
ज्यादा दिलचस्प है कि संकलक स्वतः ही हर विधि स्थानीय चर का उपयोग करता है पर .locals init
ध्वज जोड़ता है। यह ध्वज जेआईटी कंपाइलर को कोड उत्पन्न करने का कारण बनता है जो सभी स्थानीय चर को उनके डिफ़ॉल्ट मानों में प्रारंभ करता है। मतलब है, भले ही आप पहले से ही अपने स्वयं के कोड में उन्हें प्रारंभ कर दिया है, JIT .locals init
ध्वज का पालन करने और उचित प्रवर्तन कोड उत्पन्न होगा। यह "डुप्लिकेट आरंभीकरण" विन्यास कि अनुकूलन, JIT कम्पाइलर दोहराव का पता लगाने और प्रभावी ढंग से "मृत कोड" (स्वत: जनरेट प्रारंभ दिनचर्या उत्पन्न कोडांतरक निर्देश पर दिखाई नहीं देगा) के रूप में यह व्यवहार करेगा अनुमति देते हैं के बाद से प्रदर्शन प्रभावित नहीं करता।
माइक्रोसॉफ्ट के अनुसार (अपने ब्लॉग पर एक प्रश्न के जवाब में एरिक लिपर्ट द्वारा समर्थित), ज्यादातर अवसरों पर, जब प्रोग्रामर अपने स्थानीय चर को प्रारंभ नहीं करते हैं, तो वे ऐसा नहीं करते क्योंकि वे पर निर्भर करते हैं अंतर्निहित वातावरण को उनके चर को प्रारंभ करने के लिए डिफ़ॉल्ट मान हैं, लेकिन केवल इसलिए कि वे "भूल गए", इस प्रकार, कभी-कभी-भ्रामक तार्किक बग पैदा करते हैं।
तो क्रम में इस प्रकार की कीड़े के लिए संभावना को कम करने के लिए सी # कोड में प्रदर्शित करने में, संकलक अभी भी इस बात पर जोर है कि आप अपने स्थानीय चर प्रारंभ हो जाएगा। भले ही यह उत्पन्न आईएल कोड में .locals init
ध्वज जोड़ने जा रहा है।
एक इस विषय पर और अधिक व्यापक विवरण यहां पाया जा सकता: Behind The .locals init Flag
कि सिर्फ सवाल दोहरा रहा है। पर क्यों? –
@YairHalberstadt जो इस पर निर्भर करता है कि "क्यों?" एक नियम या नियम के पीछे कारण का मतलब है। मैंने पहले जवाब दिया, जो तर्कसंगत सवाल का जवाब देता है; पल के लिए: क्योंकि जब तक आप पर विचार किया है निर्माता श्रृंखलन, आभासी तरीकों निर्माण के दौरान बुलाया जा रहा है, और तथ्य यह है कि आईएल स्तर पर आधार कंस्ट्रक्टर्स कॉल श्रृंखला में किसी भी बिंदु पर कहा जा सकता है - यह कुछ भी कहने के लिए लगभग असंभव हो जाता है क्षेत्र प्रारंभिक के बारे में समझदार; समान रूप से, फ़ील्ड को ओवरलैप किया जा सकता है जिससे अंतरिक्ष को शून्य करने के लिए और भी महत्वपूर्ण हो जाता है, इसलिए कोई इनिट तकनीकी रूप से आवश्यक नहीं है - इसके विपरीत ... –
@YairHalberstadt स्थानीय चर, जिनके पास बहुत आसान असाइनमेंट जांच है, जहां अनियंत्रित आमतौर पर एक त्रुटि होती है, और जहां हम शून्यिंग छोड़ सकते हैं (हालांकि वर्तमान रनटाइम कभी नहीं करता है, आईआईआरसी)। –