Visual Basic 中的命名空間

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

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

Dim LBox As System.Windows.Forms.ListBox

避免名稱衝突

.NET Framework 命名空間會解決有時稱為「命名空間干擾」的問題,也就是類別程式庫的開發人員因為使用與另一個程式庫中類似的名稱而受到阻礙的情況。 這些與現有元件的衝突有時稱為 「名稱衝突」(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 的物件:

Screenshot that shows two namespace hierarchies.

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

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

完整名稱

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

Dim LBC As New ListBoxProject.Form1.ListBox

完整名稱可防止命名衝突,因為完整名稱讓編譯器能夠判斷正在使用哪一個物件。 不過,名稱本身可能既長又累贅。 若要解決這個問題,您可以使用 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 模稜兩可。

命名空間層級陳述式

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

完整名稱中的 Global 關鍵字

如果您已定義巢狀的命名空間階層,則可能會封鎖該階層內程式碼存取 .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 關鍵字

您也可以在 Global 中使用 Global(name collision)。 這可讓您從專案的根命名空間定義一個命名空間。

專案中的所有命名空間都會以專案的根命名空間為基礎。 Visual Studio 會針對專案中的所有程式碼,將專案名稱指派為預設根命名空間。 例如,如果專案已命名為 ConsoleApplication1,其程式設計項目會屬於命名空間 ConsoleApplication1。 如果您宣告 Namespace Magnetosphere,專案中的 Magnetosphere 參考可存取 ConsoleApplication1.Magnetosphere

下列範例使用 Global 關鍵字,從專案的根命名空間宣告一個命名空間。

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

在命名空間宣告中, Global 不能以巢狀方式放在另一個命名空間中。

您可以使用 Application Page, Project Designer (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

另請參閱