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) 和任何與專案關聯的命名空間。

請參閱

工作

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

參考

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

ListBox

System.Windows.Forms

概念

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

參考和 Imports 陳述式 (Visual Basic)