2009-01-13 5 views
5

मौजूदा कोड में कुछ स्वरूपण करने का प्रयास करते समय मुझे आज एक त्रुटि मिली। मूल रूप से, कोड using निर्देशों नाम स्थान के बाहर की घोषणा की थी:क्या 'उपयोग' निर्देश का स्थान सी # में एक अंतर बनाता है?

using System.Collections.Generic; 
namespace MyNamespace 
{ 
    using IntPair = KeyValuePair<int, int>; 
} 

जब मैं (StyleCop के नियमों का पालन करने) के बयान के अंदर using निर्देश डालने की कोशिश की, मैं अलियासिंग निर्देश पर एक त्रुटि गया, और मैं इसे पूरी तरह से अर्हता प्राप्त करनी थी:

namespace MyNamespace 
{ 
    using System.Collections.Generic; 
    //using IntPair = KeyValuePair<int, int>; // Error! 
    using IntPair = System.Collections.Generic.KeyValuePair<int, int>; // works 
} 

मुझे आश्चर्य है कि दोनों मामलों के बीच क्या अंतर है? क्या (आयात-शैली) का स्थान using निर्देशक पदार्थ है?

उत्तर

6

मुझे लगता था कि इससे कोई फर्क नहीं पड़ता, लेकिन मैं हमेशा आदेशों का उपयोग करके अर्हता प्राप्त करता हूं।

संपादित करें: चेक C# spec, खंड 9.4 का कहना है कि:

एक का उपयोग कर-निर्देश के दायरे विशेष रूप से-निर्देशों का उपयोग करके अपने साथियों के शामिल नहीं है। इस प्रकार, सहकर्मी का उपयोग करने वाले निर्देश एक-दूसरे को प्रभावित नहीं करते हैं, और जिस क्रम में वे लिखे गए हैं, वे महत्वहीन नहीं हैं।

तो अगर सिस्टम। चयन। जेनेरिक और कीवेल्यूपेयर को सहकर्मियों के रूप में माना जाता है तो KeyValuePair सिस्टम को अनदेखा करने जा रहा है। चयन। जेनेरिक।

5

हां, यह कुछ हद तक करता है। स्कोपिंग/स्थानीय नामों के साथ एक एज-केस है, Eric Lippert's blog देखें।

एक ठोस उदाहरण (उर्फ उपयोग करने के लिए विशिष्ट) के लिए:

using System; 
using Foo = Bar; 
public static class Bar { 
    public static void Test() { Console.WriteLine("outer"); } 
} 
namespace MyNamespace { 
    //using Foo = Bar; 

    public static class Bar { 
     public static void Test() { Console.WriteLine("inner"); } 
    } 
    static class Program { 
     static void Main() { 
      Foo.Test(); 
     } 
    } 
} 
1

हाँ यह होता है, मैं एक ऐसी ही question (Namespace collisions) के लिए एक working example है।

संक्षेप में यदि उपयोग निर्देश वैश्विक (नामस्थान के बाहर) या नामस्थान के अंदर उच्च प्राथमिकता लेता है तो नाम लुकअप के नियम अलग-अलग होते हैं।

1

यह पूरी तरह से सूचनात्मक है, जवाब में से एक यह दावा करता है कि यह असेंबली लोड होने के समय को प्रभावित करता है; लेकिन हकीकत में, असेंबली पहली बार लोड की जाती है, जिसका उपयोग विधि/प्रकार उनके द्वारा किया जाता है (या प्रतिबिंब के माध्यम से उपयोग किया जाता है)।

यहां एक उदाहरण है जिसमें कोई फर्क नहीं पड़ता;

using System; 
//using System.Linq; 
namespace Foo { 
    using System.Linq; 
    class Program { 
     static Program() { 
      AppDomain.CurrentDomain.AssemblyLoad += (s, a) => { 
       Console.WriteLine(a.LoadedAssembly.FullName); 
      }; 
     } 
     static void Main() {    
      Console.WriteLine("pre-Bar"); 
      Bar(); 
      Console.WriteLine("post-Bar"); 
      Console.ReadLine(); 
     } 
     static void Bar() { 
      Console.WriteLine("pre-Max"); 
      int[] data = { 1, 2, 3, 4, 5 }; 
      Console.WriteLine("Max: " + Enumerable.Max(data)); 
      Console.WriteLine("post-Max"); 
     } 
    } 
} 
:;: System.Core Bar के रूप में भरी हुई है JITted हो जाता है:

pre-Bar 
System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
pre-Max 
Max: 5 
post-Max 
post-Bar 

उदाहरण (आदर्श रिलीज विन्यास में डीबगर में नहीं आदेश पंक्ति पर चलाने के लिए,) या तो स्थान में using साथ, उत्पादन में एक ही है

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