類型提升 (Visual Basic)

當您在模組中宣告程式設計元素時,Visual Basic 會將範圍升階為包含模組的命名空間。 這稱為「型別提升」

下列範例顯示模組的基本結構定義,以及該模組的兩個成員。

Namespace projNamespace
    Module projModule
        Public Enum basicEnum As Integer
            one = 1
            two = 2
        End Enum
        Public Class innerClass
            Shared Sub numberSub(ByVal firstArg As Integer)
            End Sub
        End Class
    End Module
End Namespace

projModule 中,在模組層級宣告的程式設計元素會升階為 projNamespace。 在上述範例中,basicEnuminnerClass 會升階,但 numberSub 不是,因為其不會在模組層級宣告。

型別提升的效果

型別提升的效果是限定性字串不需要包含模組名稱。 下列範例會對上述範例中的程序進行兩次呼叫。

Sub usePromotion()
    projNamespace.projModule.innerClass.numberSub(projNamespace.projModule.basicEnum.one)
    projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
End Sub

在上述範例中,第一次呼叫會使用完整的限定性字串。 然而,這並非必要,因為有型別提升。 第二個呼叫也會存取模組的成員,而不需在限定性字串中包括 projModule

型別提升的失敗

若命名空間已有與模組成員同名的成員,則該模組成員的型別提升就會失敗。 下列範例顯示列舉的基本結構定義,以及相同命名空間中的列舉與模組。

Namespace thisNamespace
    Public Enum abc
        first = 1
        second
    End Enum
    Module thisModule
        Public Class abc
            Public Sub abcSub()
            End Sub
        End Class
        Public Class xyz
            Public Sub xyzSub()
            End Sub
        End Class
    End Module
End Namespace

在上述範例中,Visual Basic 無法將類別 abc 升階為 thisNameSpace,因為命名空間層級已經有具備相同名稱的列舉。 若要存取 abcSub,您必須使用完整限定性字串 thisNamespace.thisModule.abc.abcSub。 然而,類別 xyz 仍會升階,且您可以使用較短的限定性字串 thisNamespace.xyz.xyzSub 來存取 xyzSub

Partial 類型的型別提升失敗

若模組中的類別或結構使用 Partial 關鍵字,則不論命名空間是否有同名的成員,該類別或結構的型別提升都會自動失敗。 模組中的其他元素仍符合型別提升的資格。

結果。 部分定義的型別提升失敗可能會導致非預期結果,甚至是編譯器錯誤。 下列範例顯示類別的部分基本結構定義,其中一個定義位於模組中。

Namespace sampleNamespace
    Partial Public Class sampleClass
        Public Sub sub1()
        End Sub
    End Class
    Module sampleModule
        Partial Public Class sampleClass
            Public Sub sub2()
            End Sub
        End Class
    End Module
End Namespace

在上述範例中,開發人員可能會預期編譯器合併 sampleClass 的兩個部分定義。 然而,編譯器不會考慮 sampleModule 中的部分定義提升。 因此,其會嘗試編譯兩個個別與不同的類別,兩者都名為 sampleClass,但具有不同的限定性路徑。

只有在完整路徑相同時,編譯器才會合併部分定義。

建議

下列建議表示良好的程式設計做法。

  • 唯一名稱。 當您完全控制程式設計元素的命名時,最好一律在任何地方都使用唯一的名稱。 相同的名稱需要額外的限定性條件,且可能會讓您的程式碼難以閱讀。 其也可能會導致細微的錯誤與非預期結果。

  • 完整限定性條件。 當您使用相同命名空間中的模組與其他元素時,最安全的方法就是一律對所有程式設計元素都使用完整限定性條件。 若模組成員的型別提升失敗,且您未完整限定該成員,則您可能會不小心存取不同的程式設計元素。

另請參閱