2012-02-25 14 views

Odpowiedz

16

To namespace „globalne” - zmusza kompilator szukać nazwy bez podejmowania innych dyrektyw pomocą pod uwagę . Na przykład, załóżmy, że miałem:

public class Bar{} 

namespace Foo 
{ 
    public class Bar {} 

    public class Test 
    { 
     static void Main() 
     { 
      Bar bar1 = null; // Refers to Foo.Bar 
      global::Bar bar2 = null; // Refers to the "top level" Bar 
     } 
    } 
} 

Zasadniczo jest to sposób na uniknięcie kolizji nazewnictwa - jesteś najbardziej prawdopodobne, aby zobaczyć go w narzędzia wygenerowany kod, gdzie narzędzie nie musi znać wszystkie inne typy w system. Rzadko potrzeba go w ręcznie napisanym kodzie.

Zobacz "How to: Use the global namespace alias" na stronie MSDN, aby uzyskać więcej informacji, wraz z :: namespace qualifier.

+1

To prawda, jest on generowany przez Entity Framework firmy Microsoft, podczas próby wygenerowania kodu out z .edmx pliku. Wielkie dzięki – user1010572

5

Jest to alias przestrzeni nazw globalnych.

Jeśli zadeklarujesz typ o nazwie System.Int32 w swojej bazie kodowej, możesz rozróżnić wbudowany .NET, używając tego aliasu.

// your code 
namespace System 
{ 
    public class Int32 
    { 
    } 
} 

// You could reference the BCL System.Int32 like this: 
global::System.Int32 bclInt; 
System.Int32 myInt; 

Zobacz How to: Use the Global Namespace Alias (C# Programming Guide) na MSDN.

+0

Twoje 'Int32' to' global :: System.Int32': twoja przestrzeń nazw 'System' nie jest zagnieżdżona. Również przestrzenie nazw nie mają widoczności. – hvd

+0

@hvd: Oczywiście, że przestrzenie nazw mają * widoczność *; muszą mieć * widoczność *, ponieważ mogą być * ukryte *, a * ukryta * przestrzeń nazw jest z definicji nie * widoczna *. Myślę, że chciałeś powiedzieć, że przestrzenie nazw nie mają * dostępności *, ale to jest dziwny sposób na określenie dostępności przestrzeni nazw; lepszym sposobem myślenia jest to, że * wszystkie przestrzenie nazw mają publiczny dostęp *. –

+0

@EricLippert Przyznaję, że nigdy nie słyszałem o ukrytych przestrzeniach nazw. Po sprawdzeniu: czy odnosisz się do przestrzeni nazw w zewnętrznym zestawie zawierającym tylko wewnętrzne klasy? Jeśli tak, Visual Studio i kompilator C# nie zgadzają się, czy są widoczne: 'using System.Data.Entity.Internal;' jest podkreślany jako błąd, ale akceptowany przez kompilator. Nie wiem, co mówi spec. – hvd