Visual Basic 中的命名空間

命名空間可組織組件中定義的物件。 組件可包含多個命名空間,而命名空間也可包含其他命名空間。 在使用像類別庫 (Class Library) 之類的大型物件群組時,命名空間可避免語意模糊並簡化參考。

例如,.NET Framework 會在 System.Windows.Forms 命名空間中定義 ListBox 類別。 下列程式碼片段顯示如何使用這個類別的完整名稱來宣告變數:

Dim LBox As System.Windows.Forms.ListBox

避免名稱衝突

.NET Framework 命名空間會解決所謂「命名空間干擾」(Namespace Pollution) 的問題,也就是類別庫的開發人員因為使用與另一個程式庫類似的名稱而受到阻礙的情況。 這些與現有元件所產生的衝突有時稱為「名稱衝突」(Name Collision)。

例如,如果您建立了一個命名為 ListBox 的新類別,您不需完整名稱就可以在專案內使用它。 但是,如果您想在同一個專案中使用 .NET Framework ListBox 類別,則必須使用完整名稱以使它成為唯一的參考。 如果參考不是唯一的,Visual Basic 會產生錯誤,表示該名稱模稜兩可。 下列程式碼示範說明如何宣告這些物件:

' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox

下列圖例顯示兩個命名空間階層,兩者都包含了一個命名為 ListBox 的物件。

命名空間階層架構

根據預設,每個用 Visual Basic 建立的可執行檔,都會包含一個與專案同名的命名空間。 例如,如果您在名為 ListBoxProject 的專案中定義物件,則可執行檔 ListBoxProject.exe 會包含一個名為 ListBoxProject 的命名空間。

多個組件可以使用相同的命名空間。 Visual Basic 會將它們視為一個名稱集。 例如,您可以在命名為 Assemb1 的組件中為稱為 SomeNameSpace 的命名空間定義類別,並自一個命名為 Assemb2 的組件中為相同的命名空間定義其他類別。

完整名稱

完整名稱是物件參考,會以定義物件之命名空間的名稱做為前置詞。 如果您建立類別的參考 (在 [專案] 功能表中選擇 [加入參考]),就可以使用其他專案所定義的物件,並且在程式碼中使用該物件的完整名稱。 下列程式碼片段顯示如何使用另一個專案命名空間的物件之完整名稱:

Dim LBC As New ListBoxProject.Form1.ListBox

完整名稱會防止名稱衝突,因為完整名稱讓編譯器 (Compiler) 能夠判斷正在使用哪一個物件。 但是,名稱本身可能是既長又累贅的。 若要解決這個問題,您可以使用 Imports 陳述式定義一個「別名」(Alias),也就是可用於取代完整名稱的縮寫名稱。 例如,下列程式碼範例會建立兩個完整名稱的別名,並且使用這些別名定義兩個物件。

Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox

如果您使用沒有別名的 Imports 陳述式,則不需要提供完整名稱就可以使用該命名空間中的所有名稱,但前提是這些名稱對於專案而言是唯一的。 如果您的專案所包含的 Imports 陳述式與命名空間內的項目有相同名稱,您必須在使用時提供完整名稱。 例如,假設您的專案含有下列兩個 Imports 陳述式:

' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

如果您嘗試使用 Class1 但未提供完整名稱,則 Visual Basic 會產生錯誤,表示名稱 Class1 模稜兩可。

命名空間層級陳述式

在命名空間中,您可以定義像是模組、介面、類別、委派 (Delegate)、列舉、結構和其他命名空間等項目。 您無法在命名空間層級定義諸如屬性、程序、變數和事件的項目。 這些項目必須在諸如模組、結構或類別的容器 (Container) 內宣告。

完整限定名稱中的全域關鍵字

如果您已定義巢狀的命名空間階層架構,則可能會封鎖該階層架構內程式碼存取 .NET Framework 的 System 命名空間。 下列範例將說明 SpecialSpace.System 命名空間會封鎖存取 System 的階層架構。

Namespace SpecialSpace
    Namespace System
        Class abc
            Function getValue() As System.Int32
                Dim n As System.Int32
                Return n
            End Function
        End Class
    End Namespace
End Namespace

因此,Visual Basic 編譯器無法順利解析 System.Int32 的參考,因為 SpecialSpace.System 未定義 Int32。 您可以使用 Global 關鍵字,在 .NET Framework 類別庫的最外層啟動限定性鏈結。 這樣做可讓您指定類別庫中的 System 命名空間或任何其他命名空間。 下列範例將說明這點。

Namespace SpecialSpace
    Namespace System
        Class abc
            Function getValue() As Global.System.Int32
                Dim n As Global.System.Int32
                Return n
            End Function
        End Class
    End Namespace
End Namespace

您可以使用 Global,存取其他根層次的命名空間 (如 Microsoft.VisualBasic) 和任何與專案關聯的命名空間。

在 Namespace 陳述式中的全域關鍵字

您也可以使用Global中的關鍵字Namespace 陳述式。 這可讓您定義專案的根命名空間的命名空間。

在專案中的所有命名空間根據專案的根命名空間。 Visual Studio 會根據專案內的所有程式碼,將專案名稱指定為預設根命名空間的名稱。 例如,如果專案已命名為 ConsoleApplication1,則它的程式設計項目會屬於命名空間 ConsoleApplication1。 如果您宣告Namespace Magnetosphere,以參考Magnetosphere在專案中將會存取ConsoleApplication1.Magnetosphere。

下面範例使用Global關鍵字來宣告的命名空間,專案的根命名空間用完。

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

在命名空間宣告中, Global無法巢狀方式置於另一個命名空間。

您可以使用專案設計工具、應用程式頁 (Visual Basic)來檢視及修改根 Namespace 的專案。 新的專案中, 根 Namespace 的預設值為專案名稱。 讓Global成為最上層的命名空間,您可以清除根 Namespace 項目,讓方塊是空白的。 清除根 Namespace 則不需要的Global命名空間宣告中的關鍵字。

如果Namespace陳述式宣告也是中的命名空間的名稱。NET framework 的好處,。NET Framework 命名空間會變成無法使用如果Global完整限定名稱中沒有使用關鍵字。 若要啟用存取權的。NET Framework 命名空間,而不需要使用Global關鍵字,您可以加入Global中的關鍵字Namespace陳述式。

下列範例包含Global中的關鍵字System.Text命名空間宣告。

如果Global關鍵字不存在於命名空間宣告中, StringBuilder無法存取但未指定Global.System.Text.StringBuilder。 專案名稱為ConsoleApplication1,參考至System.Text會存取ConsoleApplication1.System.Text如果Global不使用關鍵字。

Module Module1
    Sub Main()
        Dim encoding As New System.Text.TitanEncoding

        ' If the namespace defined below is System.Text
        ' instead of Global.System.Text, then this statement
        ' causes a compile-time error.
        Dim sb As New System.Text.StringBuilder
    End Sub
End Module

Namespace Global.System.Text
    Class TitanEncoding

    End Class
End Namespace

請參閱

工作

HOW TO:使用命令列建立和使用組件 (C# 和 Visual Basic)

參考

Imports 陳述式 (.NET 命名空間和型別)

ListBox

System.Windows.Forms

概念

組件和全域組件快取 (C# 和 Visual Basic)

參考和 Imports 陳述式 (Visual Basic)

撰寫 Office 方案中的程式碼