2017-12-13 98 views
6
using System.Net;  // (See Chapter 16) 
    ... 
    string s = null; 
    using (WebClient wc = new WebClient()) // why there is no brackets after this using statement 
     try { s = wc.DownloadString ("http://www.albahari.com/nutshell/"); } 
     catch (WebException ex) 
     { 
     if (ex.Status == WebExceptionStatus.Timeout) 

      Console.WriteLine ("Timeout"); 
     else 
      throw;  // Can't handle other sorts of WebException, so rethrow 
     } 

उपरोक्त कोड को संक्षेप में पृष्ठ 153 सी # से कॉपी किया गया है, मुझे समझ में नहीं आता कि {} उपयोग कथन के बाद क्यों गायब है, क्या यह पुस्तक में एक टाइपो (असंभव) है या बस इसकी आवश्यकता नहीं है? वाक्यविन्यास यह है कि {} के अंदर कोड के ब्लॉक द्वारा अनुसरण करने की आवश्यकता का उपयोग करना।सी # "प्रयोग" कथन का पालन करें कथन कथन द्वारा अनुसरण करें, उस मामले में ब्रैकेट को अंजाम दिया जा सकता है?

मैं इस कोड होने की अपेक्षा करेंगे:

using System.Net;  // (See Chapter 16) 
    ... 
    string s = null; 
    using (WebClient wc = new WebClient()) // why there is no brackets after this using statement 
    { 
     try { s = wc.DownloadString ("http://www.albahari.com/nutshell/"); } 
     catch (WebException ex) 
     { 
     if (ex.Status == WebExceptionStatus.Timeout) 

      Console.WriteLine ("Timeout"); 
     else 
      throw;  // Can't handle other sorts of WebException, so rethrow 
     } 
    } 
+1

हम एकाधिक लाइनों के दायरे को पेश करने के लिए ब्लॉक '{}' का उपयोग करते हैं, हम उनका उपयोग नहीं करते हैं जब हम 'अगर (सत्य) वापसी जैसे एकल लाइन का दायरा पेश करना चाहते हैं; इस मामले में ' कोशिश करें 'स्टेटमेंट अपने बहु-लाइन स्कोप पेश करेगा। तो यह आवश्यक नहीं है। – Mahmoud

+0

घुंघराले ब्रेसिज़ केवल तभी जरूरी हैं जब आपके पास कई कथन शामिल हों जिन्हें आप शामिल करना चाहते हैं। एक प्रयास एक कथन है, इसलिए उनकी आवश्यकता नहीं है, लेकिन यह खराब रूप है। और आप तकनीकी रूप से सभी घुंघराले ब्रेसिज़ को हटा सकते हैं और कोड अभी भी वैसे ही काम करेगा। – juharr

+0

मुझे लगता है कि – Paparazzi

उत्तर

10

आप C# Specification में using बयान के व्याकरण को देखें, तो आप देखते हैं कि बयानों का उपयोग करके पीछा कर रहे हैं (या बल्कि, उनके शरीर के होते हैं) "embedded_statements"।

embedded_statement 
    : block 
    | empty_statement 
    | expression_statement 
    | selection_statement 
    | iteration_statement 
    | jump_statement 
    | try_statement 
    | checked_statement 
    | unchecked_statement 
    | lock_statement 
    | using_statement 
    | yield_statement 
    | embedded_statement_unsafe 
    ; 

तो हाँ, यह नहीं कोई गलती है:

using_statement 
    : 'using' '(' resource_acquisition ')' embedded_statement 
    ; 

एंबेडेड बयान इस प्रकार परिभाषित कर रहे हैं। using (...) के बाद, embedded_statement में परिभाषित किए गए किसी भी बयान में से कोई भी हो सकता है। और वैसे भी, यह देखने के लिए कि यह एक टाइपो है, आप बस उदाहरण कोड संकलित करने की कोशिश कर सकते थे।

1

यदि {} छोड़ा गया है तो अगला विवरण उपयोग के तहत बयान है। इस मामले में try कथन होगा।

if(x == 0) return; // No {} the next statement is affected by the if 

{} मूल रूप से समूहों कई बयानों को एक साथ एक सिंगल स्टेटमेंट में बदलकर तो मूलतः एक ही नियम लागू होता है:

यह करने के लिए बयान (या किसी अन्य) यदि समान है।

0

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

लेकिन यदि मैं ब्रैकेट जोड़ता हूं, तो कोई साइड इफेक्ट सही नहीं है?

नहीं, कोई दुष्प्रभाव नहीं है। Optimization ध्वज अक्षम होने पर वास्तव में आपका कोड IL कोड में कुछ अतिरिक्त NOP निर्देशों के साथ समाप्त हो सकता है। उदाहरण के लिए इस विधि:

public void CurlyBracesMethod(){ 
    { 
     int r = 1; 
     r+=2; 
    } 
    if(true) 
     return; 
} 

निम्नलिखित के रूप में आईएल में प्रतिनिधित्व किया जाएगा [Optimization ध्वज अक्षम किया गया है]:

.locals init (int32 V_0, 
      bool V_1) 
    IL_0000: nop 
    IL_0001: nop 
    IL_0002: ldc.i4.1 
    IL_0003: stloc.0 
    IL_0004: ldloc.0 
    IL_0005: ldc.i4.2 
    IL_0006: add 
    IL_0007: stloc.0 
    IL_0008: nop 
    IL_0009: ldc.i4.1 
    IL_000a: stloc.1 
    IL_000b: br.s  IL_000d 
    IL_000d: ret 

जबकि, निम्न विधि:

public void NonCurlyBracesMethod(){ 
    int r = 1; 
    r+=2; 
    if(true) 
     return; 
} 

विल IL कोड में निम्नलिखित के रूप में प्रतिनिधित्व किया जाना चाहिए:

IL_0000: nop 
    IL_0001: ldc.i4.1 
    IL_0002: stloc.0 
    IL_0003: ldloc.0 
    IL_0004: ldc.i4.2 
    IL_0005: add 
    IL_0006: stloc.0 
    IL_0007: ldc.i4.1 
    IL_0008: stloc.1 
    IL_0009: br.s  IL_000b 
    IL_000b: ret 

क्या आपका मतलब यह बेहतर है कर्ली कोष्ठक का उपयोग नहीं कर एक तार्किक त्रुटि में समाप्त हो सकता है बयान उपयोग करने के बाद कोष्ठक रखने के लिए के बजाय उसे

यह निर्भर करता है निकालने के लिए, कुछ मामलों में है। उदाहरण के लिए:

for(int i = 1;i<=n;i++){ 
     if(i%2==0){ 
     add+=1; 
     flg=true; 
    } 
} 

अगर मैं पिछले कोड से घुंघराले ब्रेसिज़ हटा दिया, add+=1 मार डाला जाएगा केवल अगर हालत संतुष्ट हो जाता है जो सच है। लेकिन flg=true हमेशा निष्पादित किया जाएगा। यह एक तार्किक त्रुटि है। इसके अलावा, आप विधि में किए गए नए दायरे को पेश करने के लिए Curly Braces का उपयोग कर सकते हैं। r परिवर्तनीय घुंघराले ब्रेसिज़ के बाहर नहीं देखा जाएगा और इस चर के संदर्भ में किसी भी प्रयास को संकलन त्रुटि के साथ समाप्त हो जाएगा। अंत में, ज्यादातर मामलों में, घुंघराले ब्रेसिज़ का उपयोग करके प्रोत्साहित किया जाता है क्योंकि यह आपके कोड को अधिक पठनीय और बनाए रखने में आसान बनाता है।

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