VB.NET類型提升失效問題總結
VB.NET是一款運行機制和Java類似的編程語言。其具有面向對象特性,能夠支持代碼托管,而且界面簡單,結構穩定,為開發人員帶來了極大的好處。在這里我們會通過對VB.NET類型提升的一些相關問題的解疑,來對這門語言進行深入的研究。
在模塊中聲明編程元素時,VB.NET會將其范圍提升到包含該模塊的命名空間。這稱為VB.NET類型提升。
下面的示例演示某個模塊和該模塊的兩個成員的主干定義。
- Namespace projNamespace
- Module projModule
- Public Enum basicEnum As Integer
- one = 1
- two = 2
- End Enum
- Public Class innerClass
- Public Sub numberSub(ByVal firstArg As Integer)
- End Sub
- End Class
- End Module
- End Namespace
在 projModule 中的模塊級別上聲明的編程元素將被提升到 projNamespace。在前面的示例中,提升了 basicEnum 和 innerClass,但是沒有提升 numberSub,因為它不是在模塊級別上聲明的。
VB.NET類型提升的結果
類型提升的結果是一個限定字符串不需要包括模塊名稱。下面的示例對前面示例中的過程發出兩個調用。
- Sub usePromotion()
- projNamespace.projModule.innerClass.numberSub
(projNamespace.projModule.basicEnum.one)- projNamespace.innerClass.numberSub(projNamespace.basicEnum.two)
- End Sub
在前面的示例中,***個調用使用完全限定字符串。但由于進行了類型提升,因此這不是必需的。第二個調用也訪問模塊的成員,但在限定字符串中不包括 projModule。
VB.NET類型提升的失效
如果命名空間中的成員與某個模塊成員同名,則對該模塊成員的類型提升將會失效。下面的示例演示同一命名空間中枚舉和模塊的主干定義。
- 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。
分部VB.NET類型提升的失效
如果模塊內的類或結構使用分部 (Visual Basic) 關鍵字,則對該類或結構的類型提升會自動失效,無論命名空間是否具有同名的成員。模塊中的其他元素仍然符合類型提升的條件。
結果。 分部定義的類型提升失效可能導致意外的結果,甚至導致編譯器錯誤。下面的示例演示類的主干分部定義,其中一個定義位于模塊內。
- Namespace sampleNamespace
- Public Partial Class sampleClass
- Public Sub sub1()
- End Sub
- End Class
- Module sampleModule
- Public Partial Class sampleClass
- Public Sub sub2()
- End Sub
- End Class
- End Module
- End Namespace
在前面的示例中,開發人員可能期望編譯器合并 sampleClass 的兩個分部定義。但是,編譯器不考慮 sampleModule 內分部定義的提升。因此,它嘗試編譯兩個名稱均為 sampleClass 但具有不同限定路徑的不同類。#t#
只有在兩個分部定義的完全限定路徑相同時,編譯器才會對這兩個分部定義進行合并。
建議
下面的建議提供了良好的編程做法。
***名稱。 當您可以完全控制編程元素的命名時,在所有位置使用***名稱始終是一個好辦法。相同的名稱需要額外的限定,并可能使代碼難以閱讀,還可能導致難以發現的錯誤和意外的結果。
完全限定。 當您在同一命名空間中使用模塊和其他元素時,最安全的方法是對所有編程元素始終使用完全限定。如果某個模塊成員的VB.NET類型提升失效,而您沒有完全限定該成員,則無意中可能會訪問另一個編程元素。