2013-02-22 28 views
67

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

+1

http://stackoverflow.com/questions/3552763/why-use-global-keyword-in-net –

+2

od MSDN: http://msdn.microsoft.com/en-us/library/c3ay4x3d.aspx –

Odpowiedz

59

globalny 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 
    { 

    } 

} 

Jeśli były w użyciu system, w którym byłoby lokalnie scoped w klasie foo, można 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 
     } 
    } 
} 
+0

Co by się stało, gdybym miał automatycznie wygenerowaną klasę z klasą prefiksowaną globalną przestrzenią nazw, a klasa nazywała się Foo Miałem utworzoną przeze mnie klasę, która również nazywała się Foo również bez przestrzeni nazw? –

+0

Jeśli klasa automatycznie generowana została poprzedzona globalną przestrzenią nazw i została nazwana Foo, globalna odnosiłaby się do klasy w globalnym obszarze nazw. W dowolnej przestrzeni nazw może istnieć tylko jedna definicja o tej samej nazwie. Jeśli utworzysz instancję klasy z innej przestrzeni nazw, dzięki której zdefiniujesz inne znaczenie dla Foo, będzie to wymagało najbardziej lokalnego zasięgu. Zobacz edycję – chrisw

17

Jest to czasami niezbędny prefiks wskazujący główny obszar nazw.

Jest często dodawany do wygenerowanego kodu, aby uniknąć konfliktu nazwy z kodem użytkownika.

Na przykład wyobraź sobie, że masz klasę o nazwie System, ale chcesz użyć System.String. Do rozróżnienia można użyć global::System.String.

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

W praktyce nigdy go nie używałem, poza generowaniem kodu. Zauważ, że możesz także ominąć niektóre konflikty za pomocą aliasów. Na przykład: using String = System.String;

12

global kluczowe 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 klas rozpoczynając od katalogu głównego. Zobaczysz go w wygenerowanym przez system kodzie, aby kod zawsze działał. W ten sposób, jeśli masz przestrzeń nazw bezpośrednio pod bieżącym obszarem nazw, który jest taki sam jak obszar nazw najwyższego poziomu, do którego próbuje uzyskać dostęp, nie będzie konfliktu.

Załóżmy na przykład, że masz przestrzeń nazw A i przestrzeń nazw B oraz przestrzeń nazw B. A jeśli piszę kod w przestrzeni nazw B.A, która musi odwoływać się do klasy w przestrzeni nazw A, bez globalnego :: Nie mam możliwości, aby się do niej dostać. Jeśli odwołam się do A.classname, kompilator będzie szukał nazwy klasy w B.A. Z global :: mogę powiedzieć, żeby szukał nazwy klasy w globalnej nazwie :: A.classname, a znajdzie nazwę klasy we właściwej lokalizacji.

+12

Jeśli bierzesz treści z zasobów internetowych, uprzejmie prosimy o podanie właściwego atrybutu: [MSDN] (http://msdn.microsoft.com/en-us/library/cc713620.aspx) i [Co to jest globalne słowo kluczowe w języku C#] (http://blog.dmbcllc.com/what-is-the-global-keyword-in-csharp/) – Bart

+2

k .. @ Bart, dziękuję za komentarz. Będę pamiętać, kiedy odpowiadam następnym razem. Ale dlaczego to jest? – coder

+0

To nie moje. – Bart