共用方式為


Visual Basic 中的命名空間

命名空間會組織元件中定義的物件。 元件可以包含多個命名空間,而這些命名空間可以進一步包含其他命名空間。 命名空間會在使用類別庫等大型物件群組時,避免模棱兩可,並簡化參考。

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

Dim LBox As System.Windows.Forms.ListBox

避免名稱衝突

.NET Framework 命名空間有時會解決稱為 命名空間污染的問題,其中類別庫的開發人員因在另一個連結庫中使用類似名稱而受到阻礙。 這些與現有元件的衝突有時稱為 名稱衝突

例如,如果您建立名為 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 會將它們視為單一名稱集。 例如,您可以在名為SomeNameSpace的元件中為命名空間Assemb1定義類別,並在名為Assemb2的元件中為同一命名空間定義其他類別。

完全限定名稱

完整名稱是對象參考,其前面會加上定義物件之命名空間的名稱。 若您從 [專案] 功能表選擇 [加入參考],以建立到類別的引用,然後在程式碼中使用該物件的完整名稱,即可使用在其他專案中定義的物件。 下列代碼段示範如何從另一個專案的命名空間使用物件的完整名稱:

Dim LBC As New ListBoxProject.Form1.ListBox

完整名稱可防止命名衝突,因為它們可讓編譯程序判斷正在使用的物件。 然而,名字本身可能會變得漫長而麻煩。 若要解決此問題,您可以使用 Imports 語句來定義 別名,這是您可以取代完整名稱的縮寫名稱。 例如,下列程式代碼範例會建立兩個完整名稱的別名,並使用這些別名來定義兩個物件。

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 模棱兩可。

命名空間層級陳述式

在命名空間內,您可以定義模組、介面、類別、委派、列舉、結構和其他命名空間等專案。 您無法在命名空間層級定義屬性、程式、變數和事件等專案。 這些項目必須在容器內宣告,例如模組、結構或類別。

完整名稱中的全域關鍵詞

如果您已定義命名空間的巢狀階層,該階層內的程式碼可能會遭到封鎖,而無法存取 System .NET Framework 的命名空間。 下列範例說明一個階層,其中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與專案相關聯的任何命名空間。

命名空間語句中的全域關鍵詞

您也可以在 Global中使用 關鍵詞。 這可讓您從專案的根命名空間定義命名空間。

您專案中的所有命名空間都是以專案的根命名空間為基礎。 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) 來檢視和修改專案的 根命名空間 。 對於新專案, 根命名空間 預設為項目名稱。 為了將 Global 設為最上層命名空間,您可以清除 根命名空間 項的內容,以使方框保持空白。 清除 根命名空間 可以使命名空間宣告中無需使用Global 關鍵字。

如果 Namespace 語句宣告的名稱同時也是 .NET Framework 中的命名空間,而名稱未使用 Global 關鍵詞指明其完整名稱,則該 .NET Framework 命名空間將無法使用。 若要在不使用 Global 關鍵詞的情況下存取該 .NET Framework 命名空間,您可以在 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

另請參閱