1. 程式人生 > 其它 >C#|::運算子和全域性名稱空間

C#|::運算子和全域性名稱空間

發現 C# 還要和 C++ 一樣的::運算子,來測試一下。

名稱空間被賦值別名以後,可以隱藏掉原有的名稱空間。想要訪問需要完整路徑。如果不用,可以用::運演算法,它的優先順序被高。

看下下面的例子:

using System;

namespace ConsoleApp1
{
    // 同名的別名空間
    using MyNamespaceAlias = MyRootNamespace.MyNestedNamespace;

    namespace MyRootNamespace
    {
        namespace MyNamespaceAlias
        {
            public class MyClass
            {
                public static void Print()
                {
                    Console.WriteLine("MyRootNamespace.MyNamespaceAlias.MyClass.Print()");
                }
            }
        }
        namespace MyNestedNamespace
        {
            public class MyClass
            {
                public static void Print()
                {
                    Console.WriteLine("MyRootNamespace.MyNestedNamespace.MyClass.Print()");
                }
            }
        }


        class Program
        {
            static void Main(string[] args)
            {
                MyRootNamespace.MyNestedNamespace.MyClass.Print(); // 可簡化名稱如下

                MyRootNamespace.MyNamespaceAlias.MyClass.Print(); // 原有的 MyNamespaceAlias 名稱空間遮蔽了別名空間。

                // 使用::運算子,迫使編譯器使用別名
                MyNamespaceAlias::MyClass.Print();
			   // MyRootNamespace. MyNamespaceAlias::MyClass.Print(); // 這樣會報錯不行,原因是顯然的,::指向別名。


                Console.ReadKey();
            }
        }
    }
}

對照輸出順序就,結合程式碼註釋,可以看出區別:

MyRootNamespace.MyNestedNamespace.MyClass.Print()
MyRootNamespace.MyNamespaceAlias.MyClass.Print()
MyRootNamespace.MyNestedNamespace.MyClass.Print()

這種方式在大專案出現別名和.NET名稱空間重名的時候有用,一般用不上吧?!

global是頂級根名稱空間的別名,如果出現上面所說的那種情況,可以這樣:

global::System.Collections.Generic.List<int>   // 一個示例



參考:
《C#入門經典第三版》P305