2010-01-13 12 views
14

मैं सोच रहा हूं कि सी # में एक चर के नाम में पहले इस्तेमाल किए गए चर नाम का उपयोग क्यों नहीं किया जाता है। इस तरह:एक बच्चे के दायरे में उपयोग किए गए एक चर नाम का उपयोग

if (true) 
{ 
    int i = 1; 
} 

int i = 2; 

ऊपर कोड संकलन एक त्रुटि पैदा करता है:

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

और फिर भी आप चर या तो बच्चे को दायरे में परिभाषित का उपयोग नहीं कर सकते हैं। ऊपर दिया गया कोड जावा में ठीक काम करता है और मुझे कोई कारण नहीं दिख रहा है कि यह सी # में क्यों नहीं है। मुझे यकीन है कि एक अच्छा कारण है, लेकिन यह क्या है?

उत्तर

14

यह सी # के डिजाइनरों द्वारा डिजाइन की गई एक डिज़ाइन पसंद है। यह संभावित अस्पष्टता को कम करता है।

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

+0

मैंने वास्तव में सोचा कि "वास्तविक" कारण होगा, क्योंकि मैं वास्तव में समझ नहीं पा रहा हूं कि कोई ऐसा क्यों पसंद करेगा। : डी लेकिन मुझे बिंदु दिखाई देता है और यह जानना अच्छा क्यों है। – Carlos

+0

खिलोन: मुझे सच में लगता है कि असली कारण यह है कि मैंने सुझाव दिया है; ^) – Toad

+1

@ करलोस फ़ैई, _real_ कारण यह है कि सभी परिवर्तनीय घोषणाओं को किसी बिंदु (संकलन या जेआईटी) पर उनके दायरे के शीर्ष पर ले जाया जाता है। इसलिए, आपकी घोषणाओं के संबंध में आपके क्षेत्रों का क्रम थोड़ा मायने रखता है, एक बच्चे/पूर्वजों का दायरा संघर्ष हमेशा रनटाइम पर एक संघर्ष होगा। संकलक इसे पहले से अस्वीकार कर देता है। – Gusdor

0

सभी संभावनाओं के लिए, किसी भी बच्चे के दायरे में बनाए गए किसी भी चर, को पल विधि दर्ज करने के लिए स्टैकफ्रेम पर रखा जाएगा।

इस तरह, एक बच्चे के दायरे में एक समान नाम किसी अन्य बच्चे के दायरे में परिवर्तनीय नाम के साथ सह-अस्तित्व में नहीं हो सकता है।

वे इस चारों ओर निश्चित रूप से काम कर सकते थे अगर वे चाहता था, इसलिए मुझे लगता है कि यह अंततः .. इस तरह से वहाँ त्रुटि

1

के रूप में एडम Crossland कहा के लिए कम मौका है डिजाइन के साथ क्या करना भी है, यह एक डिजाइन है पसंद - यह सुनिश्चित करने के लिए बनाया गया है कि आप (या अधिक संभावना है, आपके साथी डेवलपर्स) कोड को गलत समझें।

आप अक्सर एक "M_" या उपसर्ग के साथ निजी उदाहरण के सदस्यों को देख "_" (जैसे। _myVar या m_myVar) भ्रम से बचने के ..

3

कुछ मैंने देखा है कि यहाँ ध्यान दिया नहीं गया था। यह संकलन होगा:

for (int i = 0; i < 10; i++) 
{ 
    int a = i * 2; 
} 
for (int i = 0; i < 5; i++) 
{ 
    int b = i * 2; 
} 

एक साथ, ये डिजाइन फैसले असंगत लगता है, या कम से कम अजीब तरह से प्रतिबंधात्मक और अनुमोदक, क्रमशः।

+0

"मैं टॉब सिब्लिंग स्कॉप्स में एक ही चर का उपयोग क्यों कर सकता हूं" या तो टिप्पणी या कोई अन्य प्रश्न होना चाहिए। वास्तव में कोई जवाब नहीं है क्योंकि यह पोस्ट मूल प्रश्न (बच्चे/अभिभावक स्कॉप्स) के विपरीत, भाई के दायरे के बारे में बोलता है। –

+0

मैं सहमत हूं। मैं मूल प्रश्न से संबंधित सी # स्कोपिंग के बारे में कुछ अजीब बात बताकर ज्ञान बढ़ाने की कोशिश कर रहा था, लेकिन दुर्भाग्य से मैं इसे एक टिप्पणी के रूप में पोस्ट नहीं कर सका क्योंकि मेरा प्रतिनिधि इतना कम है। – jeffmk

+0

मैं वास्तव में कुछ भी गलत नहीं देख सकता, इसमें संकलन के साथ क्या गलत है? –

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