दिलचस्प पोस्ट
जब अपवाद सुरक्षित रूप से संभाला जाता है तो पहले मौका अपवाद संदेशों से बचना डब्लूसीएफ एप्लीकेशन का काम कैसे करना है? डिफ़ॉल्ट रूप से सबमिट किए गए HTML फ़ॉर्म पर बटन कैसे सबमिट करें? होम को दबाए जाने के बाद आवेदन को पुन: लॉन्च करते समय नवीनतम लॉन्च गतिविधि पर वापस कैसे जाना है? Printf के% s विनिर्देशक के साथ छपाई के व्यवहार का क्या व्यवहार है? सीएसएस मीडिया क्वेरी के लिए IE8 समर्थन क्या jqGrid होवर पाठ को AddRowData के साथ परिभाषित किया जा सकता है? DOMSubtreemodified घटना DOM स्तर 3 में पदावनत क्यों है? ट्रिगर ऑनमोसोवर ईवेंट प्रोग्रामेटिक रूप से जावास्क्रिप्ट में क्या ओरेकल डेटाबेस में एक बूलीयन प्रकार है? एकाधिक मॉडल एडमिन / Django व्यवस्थापक में एक ही मॉडल के लिए विचार आर में स्ट्रिंग में अंतिम शब्द निकालें Android, ListView IllegalStateException: "एडेप्टर की सामग्री बदल गई है लेकिन ListView को एक सूचना प्राप्त नहीं हुई" गतिशील रूप से टेम्पलेट के लिए एक सामान्य प्रकार बनाएँ जावा में, कब मुझे एक जाँच अपवाद बनाया जाना चाहिए, और यह एक रनटाइम अपवाद कब होना चाहिए?

सी # में चर गुंजाइश

मेरे दो कोड नमूने हैं I पहला संकलन नहीं करता है, लेकिन दूसरा करता है

कोड नमूना 1 (संकलन नहीं करता है)

public void MyMethod(){ int i=10; for(int x=10; x<10; x++) { int i=10; // Point1: compiler reports error var objX = new MyOtherClass(); } var objX = new OtherClassOfMine(); // Point2: compiler reports error } 

मैं समझता हूं कि कंपाइलर Point1 पर त्रुटि क्यों बताता है लेकिन मुझे समझ में नहीं आता कि यह Point2 पर त्रुटि क्यों बताता है और अगर आप कहते हैं कि यह एमएसआईएल के अंदर संगठन की वजह से है, तो दूसरा कोड उदाहरण क्यों संकलित करता है?

कोड नमूना 2 (संकलित)

 public void MyMethod(){ for(int x=10; x<10; x++) { int i=10; var objX = new MyOtherClass(); } for(int x=10; x<10; x++) { int i=10; var objX = new MyOtherClass(); } } 

अगर संकीर्ण नमूना 2 में परिवर्तनशील गुंजाइश के सरल नियम लागू होते हैं, तो उन नियमों का कोड नमूना 1 पर क्यों लागू नहीं होता है?

Solutions Collecting From Web of "सी # में चर गुंजाइश"

यहां दो प्रासंगिक नियम हैं

पहला प्रासंगिक नियम है:

यह एक स्थानीय चर घोषणा स्थान और एक ही नाम के साथ तत्वों को शामिल करने के लिए नेस्टेड स्थानीय चर घोषणा स्थान के लिए एक त्रुटि है।

(और इस पृष्ठ पर एक और जवाब विनिर्देश में दूसरे स्थान को कहता है जहां हम इसे फिर से कहते हैं।)

अकेले ही यह अवैध बनाने के लिए पर्याप्त है, लेकिन वास्तव में दूसरा नियम यह अवैध बनाता है

सी # में दूसरा प्रासंगिक नियम है:

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

आपको यह भी पता होना चाहिए कि एक लूप के लिए इलाज किया जाता है जैसे कि पूरी चीज़ के आसपास "अदृश्य ब्रेसिज़" हैं

अब जब हम जानते हैं कि, हम आपके कोड का एनोटेट करते हैं:

 public void MyMethod() { // 1 int i=10; // i1 { // 2 -- invisible brace for(int x=10; x<10; x++) // x2 { // 3 int i=10; // i3 var objX = new MyOtherClass(); // objX3 } // 3 } // 2 var objX = new OtherClasOfMine(); // objX1 } // 1 

आपके पास तीन "साधारण नाम", I, x और objX हैं। आपके पास पांच चर, जिनमें मैंने i1, x2, i3, objx3 और objX1 लेबल किया है।

सबसे बाहरी ब्लॉक जिसमें i और objX का उपयोग होता है ब्लॉक 1 है। इसलिए, ब्लॉक 1, आई और ओब्ज़एक्स के भीतर हमेशा एक ही बात का उल्लेख करना चाहिए। लेकिन वे नहीं करते। कभी-कभी मैं i1 को संदर्भित करता हूं और कभी-कभी यह i3 को दर्शाता है। ObjX के साथ ही

एक्स, हालांकि, केवल प्रत्येक खंड में केवल एक्स 2 का अर्थ है

इसके अलावा, दोनों "i" चर समान स्थानीय चर घोषणापत्र में हैं, क्योंकि दोनों "objX" चर हैं

इसलिए, यह प्रोग्राम कई तरह से एक त्रुटि है।

अपने दूसरे कार्यक्रम में:

 public void MyMethod() { // 1 { // 2 -- invisible for(int x=10; x<10; x++) // x2 { // 3 int i=10; // i3 var objX = new MyOtherClass(); // objX3 } //3 } // 2 { // 4 -- invisible for(int x=10; x<10; x++) // x4 { // 5 int i=10; // i5 var objX = new MyOtherClass(); // objX5 } //5 } // 4 } // 1 

अब आपके पास तीन साधारण नाम हैं, और छह चर।

सबसे बाहरी ब्लॉकों में सबसे पहले सरल नाम एक्स का उपयोग होता है ब्लॉक 2 और 4। ब्लॉक 2 के दौरान, एक्स x2 को संदर्भित करता है। ब्लॉक 4 के दौरान, x x4 को संदर्भित करता है। इसलिए, यह कानूनी है मैं और ओजजेक्स के साथ यही – वे ब्लॉक 3 और 5 में उपयोग किया जाता है और प्रत्येक में अलग चीजों का मतलब है लेकिन एक ही साधारण नाम का प्रयोग एक ही ब्लॉक में दो अलग-अलग चीज़ों के लिए किया जाता है।

अब, आप यह ध्यान रख सकते हैं कि सभी ब्लॉक 1 पर विचार करते हुए , x का अर्थ एक्स 2 और एक्स 4 दोनों के लिए किया जाता है लेकिन इसमें कोई भी एक्स का उल्लेख नहीं है, जो कि ब्लॉक 1 के अंदर है, लेकिन दूसरे ब्लॉक में भी नहीं है। इसलिए हम ब्लॉक 1 में असंगत उपयोग को प्रासंगिक के रूप में नहीं गिनाते हैं।

इसके अलावा, घोषणा की कोई भी जगह अवैध तरीके से ओवरलैप नहीं करता है।

इसलिए, यह कानूनी है

सी # भाषा विशिष्टता से …

स्थानीय-वेरिएबल-घोषणा में घोषित स्थानीय चर का दायरा ब्लॉक है जिसमें घोषणा होती है स्थानीय चर के लोक-वेरिएबल-घोषणाकर्ता से पहले एक पाठ की स्थिति में स्थानीय चर को संदर्भित करने के लिए एक त्रुटि है। स्थानीय वैरिएबल के दायरे के भीतर, एक अन्य स्थानीय वैरिएबल या एक ही नाम के साथ निरंतर घोषित करने के लिए यह एक संकलन-समय त्रुटि है।

कोड नमूना 1 में, दोनों I और objX फ़ंक्शन के दायरे में घोषित किए गए हैं, इसलिए उस फ़ंक्शन के किसी भी ब्लॉक में कोई अन्य चर उनके साथ एक नाम साझा कर सकता है। कोड नमूना 2 में, दोनों objX को loops के लिए घोषित किया गया है, जिसका अर्थ है कि वे किसी अन्य घोषणा से आंतरिक स्कोप में स्थानीय चर को पुनर्व्यवस्थित नहीं करने का नियम का उल्लंघन नहीं करते हैं।

गैर-अतिव्यापी स्कोप में आपको उसी वैरिएबल नाम का उपयोग करने की अनुमति है यदि एक क्षेत्र दूसरे पर ओवरलैप करता है, हालांकि, आपके दोनों में घोषित वही वैल्यू नहीं हो सकती है। इसका कारण यह है कि आप आंतरिक रूप से पहले से उपयोग किए गए वैरिएबल नाम का उपयोग करके गलती से रोकने के लिए, जैसे आपने पहले उदाहरण में i साथ किया था यह वास्तव में objX त्रुटि को रोकने के लिए नहीं है, क्योंकि यह objX होगा, बहुत भ्रमित नहीं होगा, लेकिन त्रुटि का परिणाम है कि नियम कैसे लागू होता है। कंपाइलर objX को पूरे दायरे में objX होने के रूप में मानता है जिसमें यह घोषणा के पहले और बाद में दोनों घोषित किया जाता है, न कि उसके बाद।

दूसरे उदाहरण में लूप के for दो स्वतंत्र, गैर-अतिव्यापी स्कोप हैं, इसलिए आप द्वितीय लूप में i और objX का दोबारा उपयोग करने के लिए स्वतंत्र हैं। यह भी कारण है कि आप अपने लूप काउंटर के रूप में x का पुनः उपयोग कर सकते हैं। जाहिर है, यह एक गूंगा प्रतिबंध होगा यदि आपको प्रत्येक for(i=1;i<10;++i) फंक्शन में शैली लूप के लिए प्रत्येक के for(i=1;i<10;++i) अलग-अलग नाम बनाना है

व्यक्तिगत नोट पर, मुझे यह त्रुटि परेशान हो रही है और सी / सी + + को पसंद करती है जो आपको जो भी चाहें करने की अनुमति देती है, भ्रम को शापित हो।

आपको दूसरे नमूने के साथ एक संकलन त्रुटि नहीं मिलनी चाहिए। भिन्न अक्षरों / नामों को चर का नाम बदलने का प्रयास करें और फिर से फिर से कंपाइल करें क्योंकि यह कोड के साथ अन्य समस्या हो सकती है, संभवतः आप एक घुंघराले ब्रैकेट को मिट चुके हैं और चर का दायरा रेंज बदल दिया है।