2010-08-17 14 views
37

मैं आज एक सहकर्मियों सी # कोड ढूंढ रहे थे और निम्नलिखित पाया:क्या सी # कथन का उपयोग कर घुंघराले ब्रेसिज़ के बिना लिखा जा सकता है?

using (MemoryStream data1 = new MemoryStream()) 
    using (MemoryStream data2 = new MemoryStream()) 
    { 
     // Lots of code.......... 
    } 

मैं हमेशा using बयान घुंघराले ब्रेसिज़ उस वस्तु जीवन के दायरे में परिभाषित किया गया की एक जोड़ी के बाद देखा था। कोड लिखने वाले मेरे सहकर्मी ने कहा कि data1using कथन के लिए घुंघराले ब्रेसिज़ की आवश्यकता नहीं थी और कोड वही था जैसे वे मौजूद थे और data2using कथन निहित किए गए थे। तो, क्या होता है जब घुंघराले ब्रेसिज़ कम हो जाते हैं?

+1

बस मेरे 2 सेंट - के रूप में जवाब द्वारा प्रदर्शन करते हुए आप यह करते हैं "कर सकते हैं",, मैं राय है कि आप इसे नहीं करना चाहिए, पठनीयता प्रयोजनों के लिए की हूँ। मेरे लिए, यह सिर्फ/else/while/lock/etc को लपेटने जैसा है। ब्रेसिज़ में ब्लॉक - भले ही वे आवश्यक न हों, फिर भी इसे पढ़ने में बहुत आसान है। –

+9

मेरी राय में, उपरोक्त के रूप में 'उपयोग' कथन का उपयोग किया गया है ** ** ** ** नेस्टेड 'उपयोग' कथन से कहीं अधिक पठनीय हैं। विशेष रूप से उन मामलों में जहां आप संचालन के एक सेट को करने के लिए 3-4 स्ट्रीम/स्ट्रीम रीडर को एक साथ जोड़ रहे हैं। –

+2

@ जोएल: शायद किसी और चीज की तरह, विशिष्ट स्थिति को ध्यान में रखा जाना चाहिए।अगर यह सिर्फ दो था, तो मेरी राय है कि उन्हें पूरी तरह से ब्रेसिज़ के साथ घोंसला करना है। अगर हम 4 की बात कर रहे हैं जैसे आप कहते हैं, शायद ढेर बेहतर दृष्टिकोण है। लेकिन पहली बार डेटा 2 के निर्माण से पहले डेटा 1 तक पहुंचने की आवश्यकता है, इसका मतलब है कि कोड की एक पंक्ति जोड़ने के बजाय कोड की पठनीयता बदलना। –

उत्तर

95

हाँ, आप भी उन्हें एक में कथन का उपयोग रख सकते हैं:

using (MemoryStream data1 = new MemoryStream(), 
        data2 = new MemoryStream()) 
{ 
    // do stuff 
} 
+27

+1। मुझे नहीं पता था कि आप यह कर सकते हैं – fletcher

+0

+1 अच्छा है, मैंने इसे पहले देखा होगा ... लेकिन इसके बारे में भूल गया। –

+0

मुझे पूरा यकीन है कि कुछ मामलों में इस निर्माण का व्यवहार अलग है। मुझे अभी याद नहीं है कि अभी क्यों, लेकिन मुझे विश्वास है कि मैंने इसे बिल वागर्स किताबों में से एक में पढ़ा है। – fearofawhackplanet

18

उसी नियम लागू होते हैं जब आप for या if कथन में घुंघराले ब्रेसिज़ को छोड़ देते हैं।

संयोग से यदि आप संकलित कोड में प्रतिबिंबित करते हैं, तो कंपाइलर डीकंपलर ब्रेसिज़ जोड़ता है।

+2

एक अंतर यह है कि, 'कथन' के लिए घोंसला करते समय, हम आंतरिक को इंडेंट करेंगे, लेकिन नेस्टेड 'कथन' का उपयोग आमतौर पर बाएं-गठबंधन होते हैं। यह सामान्य सम्मेलन का विषय है, निश्चित रूप से भाषा वाक्यविन्यास नहीं। –

+7

+1, नाइटपिक बिंदु: कंपाइलर वास्तव में ब्रेसिज़ नहीं जोड़ता है, डिकंपेलर उन्हें अंदर रखता है। – JaredPar

+0

@ जेरेडपार स्पष्टीकरण के लिए धन्यवाद। मैं नहीं जानता था कि। –

3

वास्तव में आपके सहयोगी ने क्या कहा, यह बयानों को घोंसले के बराबर है। data2 के लिए निपटान को data1 के लिए निपटान फ़ंक्शन से तुरंत पहले बुलाया जाएगा।

1

यदि कथन का पालन करने वाला केवल एक ही निर्देश है, तो ब्रैकेट की आवश्यकता नहीं है। यह if कथन के समान है।

if(true) 
{ 
    Console.Writeline("hello") 
} 

एक ही है कि

if(true) 
    Console.Writeline("hello") 
15

वह वास्तव में क्या कहा है। उपरोक्त कोड लिखने के रूप में बिल्कुल वैसा ही है:

using (MemoryStream data1 = new MemoryStream()) 
{ 
    using (MemoryStream data2 = new MemoryStream()) 
    { 
     // Lots of code 
    } 
} 

आप एक के बाद घुंघराले ब्रेसिज़ छोड़ सकते हैं अगर/बाकी// जबकि/का उपयोग कर/आदि बयान के रूप में लंबे समय के बयान के अंदर केवल एक आदेश नहीं है के रूप में के लिए। उदाहरण:

// Equivalent! 
if (x==6) 
    str = "x is 6"; 

if(x == 6) { 
    str = "x is 6"; 
} 

// Equivalent! 
for (int x = 0; x < 10; ++x) z.doStuff(); 

for (int x = 0; x < 10; ++x) { 
    z.doStuff(); 
} 

// NOT Equivalent! (The first one ONLY wraps the p = "bob";!) 
if (x == 5) 
p = "bob"; 
z.doStuff(); 

if (x == 5) { 
    p = "bob"; 
    z.doStuff(); 
} 
+1

इन @Stephen जैसे उदाहरण पोस्ट करने के लिए वास्तव में अच्छा विचार! – Cyberherbalist

3

यह व्यवहार्य लेकिन जोखिम भरा है क्योंकि अगर किसी को बाद में निर्णय लेता है वे पहले अन्य सामान होता है data1 के लिए कुछ करना चाहता हूँ इसके लिए, वे डेटा 1 के उपयोग के बाद इसे सही स्थान पर रख सकते हैं, जो इसे डेटा 2 के उपयोग के पूरे दायरे से बाहर ले जाएगा। यह संभवतः संकलन तोड़ देगा लेकिन अभी भी एक जोखिम भरा और व्यर्थ सिंटैक्स शॉर्टकट है ..

+8

उस व्यक्ति को शायद काम की एक अलग पंक्ति पर विचार करना चाहिए। – spoulson

+1

@spoulson: इतने सारे लोगों के बारे में सच नहीं है, लेकिन यह अभी भी हमारी नौकरियों को जितना संभव हो सके दूसरों को बनाए रखने के लिए हमारी नौकरियां है, न कि दूसरों को हमारे कोड में बग डाल दें .. –

0

जैसा कि लोगों ने कहा है: केवल एक बयान के बाद केवल एक पंक्ति होने के कारण यह घुमावदार ब्रेसिज़ के बिना काम करेगा। हालांकि, लोग अपने उदाहरणों में दिखाने के लिए उपेक्षा कर रहे हैं कि एक पंक्ति अपने स्वयं के घुमावदार ब्रेसिज़ के साथ/अगर/उपयोग कर सकती है। यहाँ एक उदाहरण है:

if(foo) 
    if(bar) 
    { 
    doStuff(); 
    } 
संबंधित मुद्दे