2013-09-20 2 views
0

Я смотрел эту страницу MSDN: Global namespace alias.C# Global Namespace Alias ​​(класс TestClass: global :: TestApp)

У них есть следующий код.

class TestApp 
{ 
    // Define a new class called 'System' to cause problems. 
    public class System { } 

    // Define a constant called 'Console' to cause more problems. 
    const int Console = 7; 
    const int number = 66; 

    static void Main() 
    { 
     // The following line causes an error. It accesses TestApp.Console, 
     // which is a constant. 
     //Console.WriteLine(number); 
    } 
} 

Они приводят дополнительные примеры.

Я понимаю, как global используется здесь:

// OK 
global::System.Console.WriteLine(number); 

Однако, я не понимаю, что следующий делает (особенно, как global::TestApp и : используются на одной линии):

class TestClass : global::TestApp 

В На странице MSDN говорится о вышеуказанном коде: «следующее объявление ссылается на TestApp как на член глобального пространства»..

Не могли бы вы объяснить это, пожалуйста?

Спасибо.

ответ

2

Это сильное имя для класса TestApp, существующего на глобальном уровне, похожее на System. Если бы вы сказали class TestClass : global::System.Console, вы бы наследовали глобальную системную консоль (если это было законно). Таким образом, в этом примере вы наследуете TestApp, который определяется в глобальной области.

Таким образом, для дополнительной ясности рассмотрим это следующая модель пространства имен для вещей:

namespace global 
{ 
    // all things are within this namespace, and therefor 
    // it is typically deduced by the compiler. only during 
    // name collisions does it require being explicity 
    // strong named 

    public class TestApp 
    { 
    } 

    namespace Program1 
    { 
     public class TestClass : global::TestApp 
     { 
      // notice how this relates to the outermost namespace 'global' 
      // as if it were a traditional namespace. 
      // the reason this seems strange is because we traditionally 
      // develop at a more inner level namespace, such as Program1. 

     } 
    }  
} 
1

В global используется таким же образом, как в:

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

является

System.Console.WriteLine(number); 

как

class TestClass : global::TestApp 

является

class TestClass : TestApp 

Сингл двоеточие только регулярное наследование.

1

Может быть, этот пример будет лучше проиллюстрировать:

Код:

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var myClass1 = new MyClass(); 
      var myClass2 = new global::MyClass(); 
     } 

     public class MyClass { } 
    } 
} 

public class MyClass { } 

Объяснение:

myClass1 является экземпляром класса в Test имен

myClass2 - это экземпляр класса в пространстве имен global, иначе не существует пространства имен.

global:: может использоваться для доступа к элементам, которые скрыты локально определенными объектами. В этом случае Test.MyClass скрывает доступ к global::MyClass.