क्यों सी # अनुमति नहीं है एक पूर्ववर्ती बयान के बिना कोड ब्लॉक (जैसे if
, else
, for
, while
)?
void Main()
{
{ // any sense in this?
Console.Write("foo");
}
}
क्यों सी # अनुमति नहीं है एक पूर्ववर्ती बयान के बिना कोड ब्लॉक (जैसे if
, else
, for
, while
)?
void Main()
{
{ // any sense in this?
Console.Write("foo");
}
}
जवाबों:
आपके द्वारा दिए गए संदर्भ में, कोई महत्व नहीं है। कंसोल के लिए एक निरंतर स्ट्रिंग लिखना प्रोग्राम प्रवाह में कहीं भी उसी तरह काम करने वाला है। 1
इसके बजाय, आप आमतौर पर कुछ स्थानीय चर के दायरे को सीमित करने के लिए उनका उपयोग करते हैं। यह आगे सविस्तार है यहाँ और यहाँ । को देखो जोआओ एंजेलो के जवाब और क्रिस वालिस का जवाब संक्षिप्त उदाहरण के लिए। मेरा मानना है कि सी-स्टाइल सिंटैक्स के साथ कुछ अन्य भाषाओं पर भी यही लागू होता है, न कि वे इस प्रश्न के लिए प्रासंगिक होंगे।
1 जब तक, निश्चित रूप से, आप अजीब होने की कोशिश करने का फैसला करते हैं और अपनी Console
कक्षा बनाते हैं , एक ऐसी Write()
विधि के साथ जो पूरी तरह से अप्रत्याशित कुछ करती है।
out
एक इंटरफ़ेस कार्यान्वयन के लिए एक पैरामीटर के रूप में पारित किया जाता है किसी अन्य भाषा में, और उस कार्यान्वयन को लिखने से पहले चर को पढ़ता है।
{ ... }
स्थानीय चर के लिए एक नया दायरे को शुरू करने से कम से कम पक्ष प्रभाव है।
मैं switch
प्रत्येक मामले के लिए एक अलग गुंजाइश प्रदान करने के लिए बयानों में उनका उपयोग करता हूं और इस तरह से मुझे स्थानीय चर को उनके उपयोग के निकटतम संभावित स्थान पर उसी नाम से परिभाषित करने की अनुमति देता है और यह भी दर्शाता है कि वे केवल केस स्तर पर मान्य हैं।
{}
उन सोने के बैज को रखने के बारे में कुछ और सवालों की जरूरत है ... :)
यह C # की इतनी अधिक विशेषता नहीं है क्योंकि यह कई C वाक्यविन्यास भाषाओं का तार्किक साइड-इफेक्ट है जो स्कोप को परिभाषित करने के लिए ब्रेसिज़ का उपयोग करता है ।
आपके उदाहरण में ब्रेसिज़ का कोई प्रभाव नहीं है, लेकिन निम्नलिखित कोड में वे दायरे को परिभाषित करते हैं, और इसलिए एक चर की दृश्यता:
यह अनुमति दी जाती है क्योंकि मैं पहले ब्लॉक में दायरे से बाहर हो जाता है और अगले में फिर से परिभाषित होता है:
{
{
int i = 0;
}
{
int i = 0;
}
}
यह अनुमति नहीं है क्योंकि मैं दायरे से बाहर हो गया हूं और अब बाहरी दायरे में दिखाई नहीं देता:
{
{
int i = 0;
}
i = 1;
}
और आगे और आगे।
{}
इसे कोष्ठक के रूप में जाना जाता है?
One of two marks of the form [ ] or ( ), and in mathematical use also {}, used for enclosing a word or number of words, a portion of a mathematical formula, or the like, so as to separate it from the context;
किसी भी मामले में वे कोष्ठक नहीं हैं, लेकिन 'घुंघराले ब्रैकेट' ठीक लगते हैं।
मैं {}
एक बयान के रूप में मानता हूं जिसमें कई कथन हो सकते हैं।
एक बयान पर विचार करें जो एक बूलियन अभिव्यक्ति से बाहर मौजूद है, उसके बाद एक बयान। यह काम करेगा:
if (true) Console.Write("FooBar");
यह भी काम करेगा:
if (true)
{
Console.Write("Foo");
Console.Write("Bar");
}
अगर मैं गलत नहीं हूँ तो इसे एक ब्लॉक स्टेटमेंट कहा जाता है।
चूंकि {}
इसमें अन्य कथन हो सकते हैं, इसलिए इसमें अन्य भी हो सकते हैं {}
। एक चर का दायरा अभिभावक {}
(ब्लॉक स्टेटमेंट) द्वारा परिभाषित किया गया है ।
मैं जिस बिंदु को बनाने की कोशिश कर रहा हूं वह {}
यह है कि यह सिर्फ एक बयान है, इसलिए इसे एक या कुछ भी आवश्यकता नहीं है ...
C- वाक्यविन्यास भाषाओं में सामान्य नियम यह है कि "किसी भी चीज़ { }
को एक कथन के रूप में माना जाना चाहिए, और यह वह जगह जा सकती है जहाँ एक एकल कथन हो सकता है"
if
।for
, while
या do
।सभी इरादों और उद्देश्यों के लिए, यह भाषा व्याकरण के रूप में शामिल है:
<statement> :== <definition of valid statement> | "{" <statement-list> "}"
<statement-list> :== <statement> | <statement-list> <statement>
यही है, "एक बयान (विभिन्न चीजों से बना हो सकता है ) या एक उद्घाटन ब्रेस के बाद, एक कथन सूची (जिसमें एक या एक से अधिक कथन शामिल हो सकते हैं), उसके बाद एक बंद ब्रेस"। IE "एक { }
ब्लॉक किसी भी जगह, कहीं भी बयान कर सकता है"। कोड के बीच में शामिल है।
{ }
ब्लॉक को कहीं भी अनुमति नहीं देने से एक भी कथन वास्तव में भाषा की परिभाषा को और अधिक जटिल बना सकता है ।
क्योंकि C ++ (और जावा) ने पूर्ववर्ती कथन के बिना कोड ब्लॉक की अनुमति दी थी।
C ++ ने उन्हें अनुमति दी क्योंकि C ने किया था।
आप यह कह सकते हैं कि यह सब इस तथ्य से कम है कि संयुक्त राज्य अमेरिका की कार्यक्रम भाषा (C आधारित) डिज़ाइन यूरोपीय कार्यक्रम भाषा ( Modula-2 आधारित) डिज़ाइन के बजाय जीती है ।
(नियंत्रण कथन एक कथन पर कार्य करते हैं, कथन नए कथन बनाने के लिए समूह हो सकते हैं)
// if (a == b)
// if (a != b)
{
// do something
}
आपने "क्यों" C # कथन के बिना कोड ब्लॉक की अनुमति देता है। प्रश्न "क्यों" की व्याख्या "इस निर्माण के संभावित लाभ क्या होंगे?" के रूप में भी की जा सकती है।
व्यक्तिगत रूप से, मैं C # में स्टेटमेंट-कम कोड ब्लॉक का उपयोग करता हूं, जहां अन्य डेवलपर्स के लिए पठनीयता में बहुत सुधार होता है, जबकि यह ध्यान में रखते हुए कि कोड ब्लॉक स्थानीय चर के दायरे को सीमित करता है। उदाहरण के लिए, निम्नलिखित कोड स्निपेट पर विचार करें, जो अतिरिक्त कोड ब्लॉक के लिए धन्यवाद पढ़ना बहुत आसान है:
OrgUnit world = new OrgUnit() { Name = "World" };
{
OrgUnit europe = new OrgUnit() { Name = "Europe" };
world.SubUnits.Add(europe);
{
OrgUnit germany = new OrgUnit() { Name = "Germany" };
europe.SubUnits.Add(germany);
//...etc.
}
}
//...commit structure to DB here
मुझे पता है कि प्रत्येक संरचना स्तर के लिए विधियों का उपयोग करके इसे और अधिक सुरुचिपूर्ण ढंग से हल किया जा सकता है। लेकिन फिर, ध्यान रखें कि नमूना डेटा सीडर्स जैसी चीजों को आमतौर पर जल्दी करने की आवश्यकता होती है।
तो भले ही ऊपर दिए गए कोड को रैखिक रूप से निष्पादित किया जाता है, कोड संरचना वस्तुओं की "वास्तविक दुनिया" संरचना का प्रतिनिधित्व करती है, इस प्रकार अन्य डेवलपर्स के लिए समझना, बनाए रखना और विस्तारित करना आसान होता है।