Visual Basic的模組和靜態匯入

來源:互聯網
上載者:User
今天在二十四畫生的文章裡發現一個問題,有些Visual Basic的使用者認為VB的內建函數直接定義在Microsoft.Visual Basic命名空間中,因此不能直接在C#中訪問。其實Microsoft.VisualBasic.dll裡面的函數,都是定義在模組裡的,C#中只要直接寫模組名就可以訪問到了。但在VB裡確實可以只通過Microsoft.VisualBasic訪問到這些函數,這使得一般的VB程式員不知道這些函數在模組裡,也不知道背後的靜態匯入操作,寧願寫Microsoft.VisualBasic.IIf,也不寫Interaction.IIf(其實後者才是最直接的寫法)。
既然普遍有人對這個問題比較模糊,我來寫一個文章介紹VB模組與靜態匯入的知識。首先來看模組。VB用下列文法定義一個模組: Public Module MyModule

End Module

VB的模組本質上是一個類(被VB加有特殊Attribute以示區別),但在VB中不能當作一個類型(即不能寫在 As, Of, CType等語句的後面),當然也就不能執行個體化和繼承。而且所有成員自動為Shared成員,以至於不用專門寫Shared。模組的建構函式也自動為Shared建構函式。 這些特性使得模組成為無狀態函數和資料的良好容器,與C# 2.0新引入的靜態類其實是一類東西。只是,模組比靜態類多了一步靜態匯入。
VB支援的“靜態匯入”特性(這最近也成為Java 5.0的新特性,但C#不支援),就是將一個類的可訪問的靜態成員匯入全域命名空間,以至於不用書寫類型名字就可以調用到這些靜態成員。比如可以在代碼開頭寫上 Imports System.Math 
Imports System.Console 

如此寫完之後,調用Math.Sin就可以直接寫成Sin;而調用Console.WriteLine也可以直接寫成WriteLine。這對於定義常數的類尤為有用。
回到剛才的話題,由於模組只能定義靜態成員,所以VB預設對所有模組自動實施一層靜態匯入,將模組中所有可訪問的成員都匯入到模組所在的命名空間中。這正是VB中所有內建函數不需要類型名作為首碼的原因。 有人說VB的模組是定義全域函數和變數的,但其實這裡只不過有一次自動靜態匯入,使得文法上類似全域函數或變數而已。
比如Microsoft.VisualBasic.Strings.Left函數,由於String是模組,自動靜態匯入,就可以用Microsoft.VisualBasic.Left來訪問。如果Microsoft.VisualBasic也被匯入,那麼就可以直接用Left這個名字來訪問。在Windows Form中,由於表單自己有Left屬性,所以造成Left函數無法直接用函數名訪問到,這時只要加上模組名,用Strings.Left就可以訪問到了,無須像大部分VB初學者那樣,用Microsoft.VisualBasic.Left這麼長的名字訪問。 要查看函數所屬的具體類型,可以用VS.NET的物件瀏覽器查看Microsoft.VisualBasic命名空間。

知道這些之後,我們也可以利用模組自動靜態匯入的特性協助我們實現一些文法上的簡化。 比如我們有個類ComputerClass,給使用者使用時我們希望使用者直接使用ComputerClass的成員,因為電腦只有一個,不需要自行執行個體化。而ComputerClass的實現可能是有狀態的,不能做成靜態類。那麼就可以寫一個模組,在模組中用一個屬性名稱叫Computer,實現ComputerClass類的單例模式。這樣使用者就可以不用ModuleName.Computer,而是只用Computer這個名稱訪問唯一的電腦對象,既保持了靜態類的文法,又有單例模式的優點。這隻是靜態匯入使用的一個很簡單的例子,在VB的My命名空間上早已廣泛採用。My的成員其實都是單例模式的對象。
對C#和C++/CLI來說,模組沒有靜態匯入,就是普通的靜態類,必須用模組名.成員名的方式訪問模組中的靜態成員,這其實就是二十四畫生應該採用的文法,而不是用VB去封裝一層。而Visual Basic的程式員也應當清楚,內建函數定義在模組裡,是通過模組進行分類和組織的。在遇到名稱衝突時,應當優先用“模組名.函數名”的方式來解決衝突,而不是錯認為這些函數直接定義在Microsoft.VisualBasic中。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.