2012-09-13 12 views
6

निम्नलिखित कोड क्यों संकलित करता है? मैं उम्मीद करता हूं कि यह दूसरी केस शाखा में घोषित नहीं होने के बारे में foo शिकायत करेगा। क्या संकलक घोषणा को संभालता है कि यह सभी मामलों के दायरे में है?अन्य मामलों के दायरे में एक केस स्टेटमेंट में घोषित चर क्यों हैं?

using System; 

namespace Scratch 
{ 
    class Scratch 
    { 
     public static void Main() 
     { 
      var x = 2; 
      switch (x) 
      { 
       case 1: 
        var foo = "one"; 
        Console.Out.WriteLine(foo); 
        break; 
       case 2: 
        foo = "two"; // is foo in scope here? 
        Console.Out.WriteLine(foo); 
        break; 
      } 
     } 
    } 
} 
+0

http://stackoverflow.com/questions/11199338/using-a-switch-statement-to-set-the-value-of-one-particular-variable-only देखने के लिए – nawfal

उत्तर

8

क्या @ जोनस्केट ने कहा सही है: सी/सी ++/सी # भावना में एक "ब्लॉक" तार्किक अर्थ में "मामला" जैसा ही नहीं है। लेकिन उन्होंने इस मुद्दे को ठीक करने के लिए "सर्वोत्तम अभ्यास" का जिक्र नहीं किया: यदि आप एक स्विच स्टेटमेंट के एक मामले के अंदर एक चर घोषित करना चाहते हैं, तो ब्लॉक में पूरे लॉजिकल "केस" को लपेटना अच्छा अभ्यास है। इस तरह लॉजिकल "केस" और संकलक द्वारा मान्यता प्राप्त वास्तविक "स्कोप" एक और वही होगा।

public static void Main() 
{ 
    var x = 2; 
    switch (x) 
    { 
     case 1: { // notice these braces I added 
      var foo = "one"; 
      Console.Out.WriteLine(foo); 
      break; 
     } 
     case 2: 
      foo = "two"; // hooray! foo is no longer in scope here 
      Console.Out.WriteLine(foo); 
      break; 
    } 
} 
+0

आप को हरा चाहते हो सकता है मुझे एक ही प्रतिक्रिया के लिए! – ColinCren

8

निम्नलिखित कोड क्यों संकलित करता है?

भाषा इस विशिष्ट क्षेत्र :(

एक स्थानीय चर का दायरा ब्लॉक जिसमें यह घोषणा की है में एक मस्तिष्क मृत तरह से बनाया गया है, और यह lexically किसी भी बिंदु पर पहुंचा जा सकता है क्योंकि घोषणा के बाद।

नहीं, मैं भाषा कि जिस तरह से या तो। मैं सी # में स्विच के डिजाइन की एक प्रशंसक नहीं हूँ ...

1

सी # चर में ब्लॉक स्तर पर scoped रहे हैं डिजाइन नहीं होता। चूंकि ब्लॉक स्विच स्टेटमेन का पालन करता है टी, फू वास्तव में दोनों मामलों में गुंजाइश है।

3

बनाने के लिए यह संकलन नहीं आप इस तरह घुंघराले ब्रेसिज़ के साथ गुंजाइश कर सकते हैं:

using System; 

namespace Scratch 
{ 
    class Scratch 
    { 
     public static void Main() 
    { 
     var x = 2; 
     switch (x) 
     { 
      case 1: 
      { 
       var foo = "one"; 
       Console.Out.WriteLine(foo); 
       break; 
      } 
      case 2: 
      { 
       foo = "two"; // is foo in scope here? 
       Console.Out.WriteLine(foo); 
       break; 
      } 
     } 
    } 
} 

यह है कि सेना केवल करने के लिए वर foo कि विशेष रूप से दायरे के भीतर मौजूद है।