2012-08-28 10 views
25

त्वरित और सरल प्रश्न। मैं समझता हूं कि नेमस्पेस एलियास क्वालीफायर क्या करता है, यह नामस्थान में सदस्यों तक पहुंचने के लिए है, हालांकि डीरफ्रेंसिंग ऑपरेटर भी करता है। मैं वास्तव में इस स्थिति में अंतर के रूप में परेशान हूं, आप एक दूसरे के ऊपर क्यों उपयोग करेंगे, या वे प्रत्येक एक ही चीज़ को कैसे पूरा करेंगे।सी # नेमस्पेस एलियास क्वालीफायर (: :) बनाम डीरफ्रेंसिंग ऑपरेटर (।)

using colAlias = System.Collections; 

namespace myns 
{ 
    class TestApp 
    { 
     static void Main() 
     { 
      colAlias.Hashtable test = new colAlias.Hashtable(); 
      colAlias::Hashtable test1 = new colAlias::Hashtable(); 
     } 
    } 
} 
+9

+1 सिर्फ इसलिए कि मैं कुछ वर्षों से सी # में प्रोग्रामिंग कर रहा हूं और मैंने कभी भी इस ऑपरेटर को कहीं भी नहीं देखा है। : डी – Tudor

+0

@ ट्यूडर वही स्थिति यहां :) बहुत ही कम देखा गया, लेकिन मैं आज इसे पार कर गया और और जानना चाहता था। –

उत्तर

11

यह एक कोने केस :: (@ उपसर्ग की तरह) है जो काफी दुर्लभ घटनाओं से निपटने के लिए है जहां नाम नामस्थान, कक्षाओं और कीवर्ड के बीच एक संघर्ष है।

:: केवल नामस्थान (और नामस्थान उपनाम) के लिए काम करता है, जबकि .। नामस्थान और उप-वर्ग दोनों के लिए काम करता है। अधिकतर स्थान जहां आपको इसकी आवश्यकता होगी, आप इसके बजाय एक अलग नाम का उपयोग करना बेहतर होगा, लेकिन यह हमेशा एक विकल्प नहीं है।

global:: एक विशेष मामला है जो अक्सर ऑटो-जेनरेट कोड में देखा जाता है - यह संदर्भित नामस्थान को रूट पर रीसेट करता है।

उदाहरण के लिए, यदि आप कुछ कोड (, एफई, या इसी तरह शायद एक रूपों अनुप्रयोग के लिए) को स्वत: जनरेट लगता है और अपने अनुप्रयोग नाम स्थान YourCompany.Application उपयोग करता है। अब आपके ग्राहकों में से एक (आपकी ऑटो-पीढ़ी का उपयोग करके) अपने ऐप TheirCompany.YourCompany.Application में अपना नामस्थान जोड़ने का फैसला करता है। अब सभी आपके ऑटो कोड विफल हो जाते हैं क्योंकि जब यह संकलित होता है। नेट को पता नहीं है कि आपके नेमस्पेस या उनके उपयोग का उपयोग करना है या नहीं।

global::YourCompany.Application के साथ इस जेनरेट कोड को ठीक करने के लिए, तो जो लोग आपके ऑटो जनरेटर का उपयोग करते हैं वे जो भी नामस्थान पसंद करते हैं और संघर्ष नहीं कर सकते हैं।

मुझे लगता है कि माइक्रोसॉफ्ट ने global:: जोड़ा क्योंकि वे कुछ नेट ग्राहकों को System जैसे नामस्थान जोड़ने की उम्मीद करते थे।

+0

_ मुझे लगता है कि माइक्रोसॉफ्ट ने वैश्विक :: जोड़ा है ... क्योंकि ... बिल्कुल नहीं: "आपको असेंबली के दो संस्करणों का संदर्भ देना पड़ सकता है जिनके पास समान रूप से योग्य प्रकार के नाम हैं" –

2

एक MSDN page समझा यह कैसे काम करता है।

असल में, आपकी स्थिति में वे एक ही चीज़ प्राप्त करेंगे और कोड पठनीयता के लिए इसे एक . का उपयोग करना पसंद किया जाएगा।

मैं :: ऑपरेटर का उपयोग किसी भी चीज़ पर नहीं बल्कि वैश्विक नामस्थान का उपयोग नहीं करता, और फिर भी इसके आसपास काम करने के पर्याप्त तरीके हैं।

संपादित करें: ऑपरेटर क्या करता है अधिक जानकारी :: Operator (C# Reference) आलेख में समझाया गया है।

0

नेमस्पेस उपनाम क्वालीफायर (: :) आपको नामकरण विधियों तक पहुंचने में सहायता करता है यदि आपके पास समान नामकरण सम्मेलन का उपयोग करके नामस्थान कॉन्फ़्लिक्टिंग हैं।

उदाहरण के लिए के रूप में MSDN में यहां विस्तार से बताया http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx

+0

उत्तर के लिए धन्यवाद, लेकिन मुझे लगता है कि बहुत कुछ, मेरा विवरण पढ़ें। जो मैं जानना चाहता था वह अंतर थे, और उदाहरण के लिए, आप वैश्विक नामस्थान तक पहुंचने के लिए डीरफ्रेंसिंग ऑपरेटर का उपयोग क्यों नहीं कर सके ... आप एक दूसरे के ऊपर क्यों उपयोग करेंगे ... –

+1

@ फ्रांसिस्कोएगुइलेरा मान लीजिए कि आपका अपना सिस्टम क्लास इस मामले में यदि आप सिस्टम चाहते हैं तो System.Console.WriteLine तक पहुंचने के लिए आप dereferencing ऑपरेटर का उपयोग कैसे करेंगे? तो आप संघर्ष से बचने के लिए वैश्विक नामस्थान ( वैश्विक :: सिस्टम। कंसोल। राइटलाइन()) तक पहुंचने के लिए नेमस्पेस उपनाम क्वालीफायर का उपयोग करें। – TWickz

1

एक namespace क्वालीफायर के सामान्य विचार आप नाम स्थान भले ही नाम कहीं और इस्तेमाल किया गया है को संदर्भित अनुमति है। यदि आपने "colAlias" नामक एक कक्षा घोषित की है तो colAlias.Hashtable कक्षा का संदर्भ देगा लेकिन colAlias ​​:: हैशटेबल नामस्थान मूल्य का संदर्भ देगा।

यह एक काफी संकीर्ण उपयोग-मामला है और global:: एकमात्र सामान्य उपयोग केस है जिसे मैंने इस ऑपरेटर के लिए देखा है (जब यह सुनिश्चित करने की कोशिश की जा रही है कि किसी अज्ञात एप्लिकेशन में संकलित किए गए जेनरेट कोड को बनाते समय कोई संघर्ष नहीं हो सकता है)।

6

तुमने कहा था:

नाम स्थान उर्फ ​​क्वालीफायर करता है, यह एक नाम स्थान में सदस्यों तक पहुँचने के लिए है, लेकिन इतना dereferencing ऑपरेटर करता है।

अच्छा, नहीं। . ऑपरेटर का उपयोग किसी भी सदस्य को फ़ंक्शंस तक पहुंचने के लिए किया जाता है। आप नहीं, Console::WriteLine();

:: केवल नामस्थान हल करने के लिए है क्या कर सकते हैं या तो इस तरह एक नाम स्थान उर्फ ​​से:

using colAlias = System.Collections; 
... 
... 
colAlias::Hashtable test = new colAlias::Hashtable(); 

या वैश्विक से

global::System.Console.WriteLine(..); 

आप नहीं कर सकते:

System.Collections::ArrayList a = new System.Collections.ArrayList(); 

लेकिन, यदि आप अपने मामले में एक उपनाम . ऑपरेटर भी काम करता है, इसलिए है, वहाँ कोई अंतर नहीं है।

+0

क्या इसका मतलब यह है कि '।' ऑपरेटर वैश्विक नामस्थान को संदर्भित करने के अलावा '::' ऑपरेटर और अधिक कुछ भी कर सकता है? – j00hi

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