Co to jest globalne ::?


116

W C # widzę global::używane dość często w kodzie generowanym automatycznie. Nie jest to coś, czego sam używałem, więc nie wiem, jaki jest tego cel. Czy ktoś może to wyjaśnić?




Odpowiedzi:


104

global odnosi się do globalnej przestrzeni nazw, może być używany do rozwiązywania problemów, dzięki którym możesz przedefiniować typy. Na przykład:

class foo
{
    class System
    {

    }

}

Gdybyś miał użyć System, gdzie byłby lokalnie objęty zakresem w klasie foo, możesz użyć:

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

aby uzyskać dostęp do globalnej przestrzeni nazw.

Przykład

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
        }
    }
}

Co by się stało, gdybym miał automatycznie wygenerowaną klasę z klasą z prefiksem globalnej przestrzeni nazw, a klasa nazywałaby się Foo Mam utworzoną przeze mnie klasę, która również nazywała się Foo, również bez przestrzeni nazw?
Sachin Kainth

Jeśli automatycznie wygenerowana klasa została poprzedzona globalną przestrzenią nazw i nosiłaby nazwę Foo, global odnosi się do klasy w globalnej przestrzeni nazw. W dowolnej przestrzeni nazw może istnieć tylko jedna definicja o tej samej nazwie. Gdybyś miał utworzyć instancję klasy z innej przestrzeni nazw, w której zdefiniowałeś inne znaczenie dla Foo, zajęłoby to najbardziej lokalny zasięg. Zobacz edycję
chrisw

26

Jest to czasami potrzebny przedrostek wskazujący główną przestrzeń nazw.

Często jest dodawany do wygenerowanego kodu, aby uniknąć kolizji nazw z kodem użytkownika.

Na przykład wyobraź sobie, że masz klasę o nazwie System, ale potem chciałeś użyć System.String. Możesz użyć global::System.Stringdo rozróżnienia.

Myślę, że ::pochodzi z C ++, gdzie jest używany jako separator przestrzeni nazw.

W praktyce nigdy go nie używałem, poza generowaniem kodu. Pamiętaj, że możesz również obejść niektóre konflikty za pomocą aliasów. Na przykładusing String = System.String;


14

globalKluczowe kontekstowa, jeśli chodzi przed :: operator, odnosi się do globalnej przestrzeni nazw, która jest domyślna przestrzeń nazw dla każdego programu C # i jest inaczej bezimienny.

Specyfikator global::mówi kompilatorowi, aby zaczął szukać przestrzeni nazw lub klasy, zaczynając od katalogu głównego. Zobaczysz to w kodzie wygenerowanym przez system, aby kod zawsze działał. W ten sposób, jeśli masz przestrzeń nazw bezpośrednio pod bieżącą przestrzenią nazw, która jest taka sama, jak przestrzeń nazw najwyższego poziomu, do której kod próbuje uzyskać dostęp, nie będzie konfliktu.

Na przykład, załóżmy, że masz przestrzeń nazw A i przestrzeń nazw B oraz przestrzeń nazw BA, jeśli napiszę kod w przestrzeni nazw BA, który musi odwoływać się do klasy w przestrzeni nazw A, bez funkcji global :: Nie mam sposobu, aby się do tego dostać. Jeśli odwołam się do A.classname, kompilator będzie szukał nazwy klasy w BA Za pomocą global :: Mogę mu powiedzieć, aby szukał nazwy klasy w global :: A.classname i znajdzie nazwę klasy we właściwej lokalizacji.


15
Jeśli pobierasz treści z zasobów online, bądź uprzejmy, aby podać właściwą atrybucję: MSDN i Jakie jest globalne słowo kluczowe w języku C #
Bart

3
k .. @ Bart dzięki za komentarz Będę o tym pamiętać, kiedy następnym razem będę odpowiadać .. Ale dlaczego tak jest przeciwnie?
koder

3

global::Nazw i jego identyfikator jest nie to, co większość ludzi myśli. Nie jest to uniwersalny identyfikator wszystkiego, co zostało utworzone w aplikacji, co znajduje się poza jedną ze zdefiniowanych przestrzeni nazw aplikacji i które jest dołączone do jakiegoś globalnego katalogu głównego.

Jeśli tworzysz klasę lub typ poza obszarami nazw najwyższego poziomu, zakładasz, że jest ona automatycznie częścią GLOBALNEJ przestrzeni nazw i jest dostępna za pomocą global::identyfikatora we wszystkich plikach w aplikacji lub zestawie. W rzeczywistości te nazwy częściej znajdują się tylko w skompilowanym zakresie LOCAL tego pliku, ale są dostępne za pośrednictwem global::identyfikatora.

Jeśli utworzysz klasę lub przestrzeń nazw najwyższego poziomu w pliku aspx.cs, będzie ona dostępna za pośrednictwem global::globalnej przestrzeni nazw w tym pliku. Ale jeśli wpiszesz global::inny plik, ta klasa i przestrzeń nazw nie istnieją w globalnej przestrzeni nazw. Jeśli jednak utworzysz tę samą klasę lub przestrzeń nazw w pliku class.cs, te elementy będą dostępne dla wszystkich innych plików za pośrednictwem global::i w globalnej przestrzeni nazw, a także w lokalnym zakresie plików. Czemu?

Okazuje się, global::że jest to tak naprawdę odniesienie do nazw LOKALNYCH najwyższego poziomu w zakresie pliku, a także nazw GLOBALNYCH współdzielonych przez zestaw (jak to, co można skompilować w plikach klas App_Code w typowym projekcie ASP.NET).

Uważam to za bardzo zagmatwane i niespójne, ponieważ global::implikuje dostęp do przestrzeni nazw najwyższego poziomu i typów utworzonych w aplikacji, które są powiązane z globalną przestrzenią nazw. Niektóre, takie jak „System”, są domyślnie przypisane do globalnej przestrzeni nazw we wszystkich plikach, ale pliki niestandardowe mogą, ale nie muszą, zależeć od zakresu tego pliku. Z tego powodu identyfikator globalny ma drugorzędną rolę w rozpoznawaniu odwołań do lokalnych nazw zakresów głównych.

Możesz to przetestować, tworząc przestrzenie nazw i klasy najwyższego poziomu w częściach aplikacji, a następnie używając, global::aby zobaczyć, do których z nich ma dostęp w globalnej przestrzeni nazw z różnych części aplikacji, a do których nie. Te, do których nie ma dostępu, są wyraźnie przypisane do „lokalnego zasięgu globalnego” tylko w tym pliku, co global::ułatwia dostęp w przypadku konfliktów nazw.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.