वैश्विक क्या है ::?


116

C # में मुझे global::ऑटो-जेनरेटेड कोड में काफी बार इस्तेमाल होता है। यह ऐसा कुछ नहीं है जिसका मैंने कभी खुद इस्तेमाल किया है इसलिए मुझे नहीं पता कि इसका उद्देश्य क्या है। क्या कोई इसे समझा सकता है?




जवाबों:


104

वैश्विक वैश्विक नामस्थान को संदर्भित करता है, इसका उपयोग उन समस्याओं को हल करने के लिए किया जा सकता है जिससे आप प्रकारों को फिर से परिभाषित कर सकते हैं। उदाहरण के लिए:

class foo
{
    class System
    {

    }

}

यदि आप सिस्टम का उपयोग करना चाहते थे, जहां यह foo वर्ग में स्थानीय रूप से स्कूप किया जाएगा, तो आप उपयोग कर सकते हैं:

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

वैश्विक नामस्थान तक पहुँचने के लिए।

उदाहरण

using System;

class Foo
{
    public void baz()
    {
        Console.WriteLine("Foo 1");
    }
}

namespace Demo
{
    class Foo
    {
        public void baz()
        {
            Console.WriteLine("Foo 2");
        }
    }

    class Program
    {
        protected static global::Foo bar = new global::Foo();

        static void Main(string[] args)
        {
            bar.baz(); // would write Foo 1 to console as it refers to global scope
            Foo qux = new Foo();
            qux.baz(); // would write Foo 2 to the console as it refers to the Demo namespace
        }
    }
}

यदि वैश्विक नामस्थान के साथ उपसर्ग वाले वर्ग के साथ मेरे पास एक ऑटो-जेनरेट किया गया वर्ग है और वर्ग को फू कहा जाता है तो मेरे पास एक वर्ग है जिसे मैंने बनाया था जिसे फू भी कहा जाता है जिसका कोई नाम नहीं है?
सचिन काइथ

यदि ऑटो उत्पन्न वर्ग को वैश्विक नामस्थान के साथ उपसर्ग किया गया था और फू कहा गया था, तो वैश्विक वर्ग में वैश्विक नाम स्थान को संदर्भित करेगा। किसी भी नामस्थान में एक ही नाम के साथ केवल एक ही परिभाषा हो सकती है। यदि आप किसी अन्य नामस्थान से कक्षा का एक उदाहरण बनाना चाहते हैं, जिसके लिए आपने फू के लिए एक और अर्थ निर्धारित किया है, तो यह सबसे अधिक स्थानीय स्कूप होगा। संपादन देखें
chrisw

26

यह रूट नेमस्पेस का संकेत देने वाला कुछ समय पूर्व आवश्यक उपसर्ग है।

उपयोगकर्ता कोड के साथ नाम की गड़बड़ी से बचने के लिए इसे अक्सर जनरेट कोड में जोड़ा जाता है।

उदाहरण के लिए, कल्पना करें कि आपके पास एक वर्ग था System, लेकिन तब आप उपयोग करना चाहते थे System.String। आप global::System.Stringअंतर करने के लिए उपयोग कर सकते हैं ।

मेरा मानना ​​है कि ::सी ++ से आता है, जहां इसे नेमस्पेस विभाजक के रूप में उपयोग किया जाता है।

व्यवहार में, मैंने इसका उपयोग कभी नहीं किया, कोड बनाने के अलावा। ध्यान दें कि आप उपनामों का उपयोग करके कुछ संघर्षों के आसपास भी पहुंच सकते हैं। उदाहरण के लिएusing String = System.String;


14

globalप्रासंगिक कीवर्ड, जब यह :: ऑपरेटर से पहले आता है, ग्लोबल नेम स्पेस, जो किसी भी सी # प्रोग्राम के लिए डिफ़ॉल्ट नाम स्थान है और नहीं तो अज्ञात है को दर्शाता है।

global::विनिर्देशक संकलक जड़ से नाम स्थान या वर्ग शुरू की तलाश शुरू करने के लिए कहता है। आप इसे सिस्टम-जनरेटेड कोड में देखेंगे ताकि कोड हमेशा काम करे। इस तरह यदि आपके पास अपने वर्तमान नामस्थान के ठीक नीचे एक नामस्थान है जो शीर्ष स्तर के नामस्थान के समान है, जिस पर कोड का उपयोग करने का प्रयास किया जा रहा है, कोई विरोध नहीं होगा।

उदाहरण के लिए, मान लें कि आपके पास नाम स्थान A और नाम स्थान B और नाम स्थान BA है यदि मैं नाम स्थान BA में कोड लिखता हूं, जिसे वैश्विक नाम के बिना नाम A में एक वर्ग का संदर्भ देने की आवश्यकता है: मेरे पास इसे प्राप्त करने का कोई तरीका नहीं है। यदि मैं A.classname का संदर्भ देता हूं, तो कंपाइलर BA के लिए वैश्विक रूप से ढूंढेगा। :: मैं इसे वैश्विक में क्लासनाम के लिए देखने के लिए कह सकता हूं :: A.classname और यह उचित स्थान पर क्लासनाम ढूंढेगा।


15
यदि आप ऑनलाइन संसाधनों से सामग्री लेते हैं, तो कृपया उचित एट्रिब्यूशन प्रदान करने के लिए पर्याप्त रहें: MSDN और C # में वैश्विक कीवर्ड क्या है
Bart

3
k .. @ आपकी टिप्पणी के लिए बार्ट धन्यवाद, जब मैं अगली बार जवाब दे रहा हूं तो ध्यान रखूंगा..लेकिन ऐसा क्यों है?
कोडर

3

global::नाम स्थान और इसके पहचानकर्ता अधिकांश लोग नहीं लगता है। यह एक एप्लिकेशन में बनाई गई सब कुछ का एक सार्वभौमिक पहचानकर्ता नहीं है जो आपके एप्लिकेशन के परिभाषित नामस्थानों में से एक के बाहर स्थित है और जो कुछ वैश्विक रूट से जुड़ा हुआ है।

यदि आप अपने शीर्ष स्तर के नामस्थानों के बाहर एक वर्ग या प्रकार बनाते हैं, तो आप global::अपने आवेदन या असेंबली में सभी फाइलों में पहचानकर्ता द्वारा स्वचालित रूप से GLOBAL नामस्थान का एक हिस्सा मान सकते हैं। वास्तव में वे नाम अधिक बार उस फ़ाइल के संकलित LOCAL दायरे में ही हैं, फिर भी global::पहचानकर्ता के माध्यम से सुलभ हैं ।

यदि आप एक aspx.cs फ़ाइल में एक शीर्ष स्तरीय वर्ग या नाम स्थान बनाते हैं, तो यह global::उस फ़ाइल में वैश्विक नामस्थान से पहुँच योग्य है । लेकिन यदि आप global::किसी अन्य फ़ाइल में टाइप करते हैं, तो वैश्विक नाम स्थान में वह वर्ग और नाम स्थान मौजूद नहीं है। यदि आप एक ही वर्ग या नामस्थान को class.cs फ़ाइल में बनाते हैं, तो वे आइटम अन्य सभी फ़ाइलों के लिए global::और वैश्विक नाम स्थान के साथ-साथ उस स्थानीय स्कोप में भी उपलब्ध हैं। क्यों?

यह global::वास्तव में शीर्ष स्तर LOCAL नामों का संदर्भ है जो फ़ाइल के दायरे में है और साथ ही विधानसभा द्वारा साझा किए गए GLOBAL नाम (जैसे कि आपके App_Code वर्ग फ़ाइलों को एक विशिष्ट ASP.NET प्रोजेक्ट में संकलित किया जा सकता है)।

मुझे यह बहुत भ्रामक और संगत नहीं लगा, क्योंकि global::इसका तात्पर्य शीर्ष-स्तरीय नामस्थानों तक पहुंच है और एप्लिकेशन में बनाए गए प्रकार जो वैश्विक नामस्थान से बंधे हैं। कुछ "सिस्टम" सभी फ़ाइलों में डिफ़ॉल्ट रूप से वैश्विक नाम स्थान से बंधे हैं, लेकिन कस्टम उस फ़ाइल के दायरे के आधार पर हो सकते हैं या नहीं भी हो सकते हैं। यही कारण है कि वैश्विक पहचानकर्ता के पास आपके स्थानीय रूट स्कोप नामों के संदर्भों को हल करने की एक माध्यमिक भूमिका है।

आप अपने एप्लिकेशन के कुछ हिस्सों में शीर्ष स्तर के नाम स्थान और कक्षाएं बनाकर इसका परीक्षण कर सकते हैं और फिर global::यह देख सकते हैं कि यह आपके एप्लिकेशन के विभिन्न हिस्सों से कौन-से वैश्विक नामस्थान में पहुंच सकता है और कौन से नहीं। इसे जिस तक नहीं पहुँचा जा सकता, उसे स्पष्ट रूप से उस फ़ाइल में "स्थानीय वैश्विक दायरे" के लिए असाइन किया गया है, जो global::आपको नामांकित संघर्षों में प्रवेश करने में मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.