C#全局命名空间别名(类TestClass:global :: TestApp)

时间:2013-09-20 18:57:36

标签: c#

我正在查看此页MSDN: Global namespace alias

他们在那里有以下代码。

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作为全局空间的成员。”

有人可以解释一下吗?

感谢。

3 个答案:

答案 0 :(得分: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 :(得分:1)

global在两者中的使用方式相同:

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

    System.Console.WriteLine(number);

as

    class TestClass : global::TestApp

    class TestClass : TestApp

单个冒号只是常规继承。

答案 2 :(得分: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 { }

<强>解释

myClass1Test命名空间

中的类的实例

myClass2global命名空间中的类的实例,也就是没有命名空间。

global::可用于访问本地定义的对象隐藏的项目。在这种情况下,Test.MyClass会隐藏对global::MyClass的访问权限。