命名空間提供了一種組織相關類和其餘類型的方式。與文件或組件不一樣,命名空間是一種邏輯組合,而不是物理組合。在C#文件中定義類時,能夠把它包括在命名空間定義中。之後,再定義另外一個類,在另外一個文件中執行相關操做時,就能夠在同一個命名空間中包含它,建立一個邏輯組合,告訴使用類的其餘開發人員這兩個類是如何相關的以及如何使用它們:
namespace CustomerPhoneBookApp
{
using System;
public struct Subscriber
{
// Code for struct here...
}
}
把一個類型放在命名空間中,能夠有效地給這個類型指定一個較長的名稱,該名稱包括類型的命名空間,後面是句點(.)和類的名稱。在上面的例子中,Subscriber結構的全名是CustomerPhoneBookApp.Subscriber。這樣,有相同短名的不一樣的類就能夠在同一個程序中使用了。
也能夠在命名空間中嵌套其餘命名空間,爲類型建立層次結構:
namespace Wrox
{
namespace ProCSharp
{
namespace Basics
{
class NamespaceExample
{
// Code for the class here...
}
}
}
}
每一個命名空間名都由它所在命名空間的名稱組成,這些名稱用句點分隔開,首先是最外層的命名空間,最後是它本身的短名。因此ProfessionalCSharp命名空間的全名是Wrox.ProCSharp,NamespaceExample類的全名是Wrox.ProCSharp.Basics.NamespaceExample。
使用這個語法也能夠組織本身的命名空間定義中的命名空間,因此上面的代碼也能夠寫爲:
namespace Wrox.ProCSharp.Basics
{
class NamespaceExample
{
// Code for the class here...
}
}
注意不容許在另外一個嵌套的命名空間中聲明多部分的命名空間。
命名空間與程序集無關。同一個程序集中能夠有不一樣的命名空間,也能夠在不一樣的程序集中定義同一個命名空間中的類型。
using語句
顯然,命名空間至關長,鍵入起來很繁瑣,用這種方式指定某個特定的類也是沒必要要的。如本章開頭所述,C#容許簡寫類的全名。爲此,要在文件的頂部列出類的命名空間,前面加上using關鍵字。在文件的其餘地方,就可使用其類型名稱來引用命名空間中的類型了:
using System;
using Wrox.ProCSharp;
如前所述,全部的C#源代碼都以語句using System;開頭,這僅是由於Microsoft提供的許多有用的類都包含在System命名空間中。
若是using指令引用的兩個命名空間包含同名的類,就必須使用完整的名稱(或者至少較長的名稱),確保編譯器知道訪問哪一個類型,例如,類NamespaceExample同時存在於Wrox.ProCSharp.Basics和Wrox.ProCSharp.OOP命名空間中,若是要在命名空間Wrox.ProCSharp中建立一個類Test,並在該類中實例化一個NamespaceExample類,就須要指定使用哪一個類:
using Wrox.ProCSharp;
class Test
{
public static int Main()
{
Basics.NamespaceExample nSEx = new Basics.NamespaceExample();
//do something with the nSEx variable
return 0;
}
}
由於using語句在C#文件的開頭,C和C++也把#include放在這裏,因此從C++遷移到C#的程序員常把命名空間與C++風格的頭文件相混淆。不要犯這種錯誤,using語句在這些文件之間並無真正創建物理連接。C#也沒有對應於C++頭文件的部分。
公司應花必定的時間開發一種命名空間模式,這樣其開發人員才能快速定位他們所須要的功能,並且公司內部使用的類名也不會與外部的類庫相沖突。本章後面將介紹創建命名空間模式的規則和其餘命名約定。
命名空間的別名
using關鍵字的另外一個用途是給類和命名空間指定別名。若是命名空間的名稱很是長,又要在代碼中使用屢次,但不但願該命名空間的名稱包含在using指令中(例如,避免類名衝突),就能夠給該命名空間指定一個別名,其語法以下:
using alias = NamespaceName;
下面的例子(前面例子的修訂版本)給Wrox.ProCSharp.Basics命名空間指定別名Introduction,並使用這個別名實例化了一個NamespaceExample對象,這個對象是在該命名空間中定義的。它有一個方法GetNamespace(),該方法調用每一個類都有的GetType()方法,以訪問表示類的類型的Type對象。下面使用這個對象來返回類的命名空間名:
using System;
using Introduction = Wrox.ProCSharp.Basics;
class Test
{
public static int Main()
{
Introduction.NamespaceExample NSEx =new Introduction.NamespaceExample();
Console.WriteLine(NSEx.GetNamespace());
return 0;
}
}
namespace Wrox.ProCSharp.Basics
{
class NamespaceExample
{
public string GetNamespace()
{
return this.GetType().Namespace;
}
}
}程序員
——————————————————ide
另外資料可學習:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/namespaces/學習