Visual Basic學習隨筆
首先說一下為什么要突擊VB,因為最近出現(xiàn)了個很邪門的需求,需要我二次開發(fā)一下SolidWorks,之前查文檔的時候發(fā)現(xiàn)Python是可以開發(fā)的,但是由于SW沒有原生的Py接口,數(shù)據(jù)類型轉換中還有一些問題,最后也是就放棄了Py的想法。而VB作為正經(jīng)的SW推薦的二次開發(fā)語言,用起來要方便得多,所以簡單的突擊一下VB,方便自己后續(xù)做二次開發(fā)。這個文章主要是給自己記錄一下VB的語法,方便自己查閱,同時如果你有編程基礎,有一些需要快速突擊的需求,那么也可以用我的文章做速查。
同時我想說一點,VB還是有不少毛病的,比如寫法和JS一樣隨意,很多關鍵詞創(chuàng)新了但沒有完全創(chuàng)新,三方庫也比較少。作為一個獨立的開發(fā)語言其實不是很合格,所以如果你沒有一定要使用VB的需求,那么我建議你別學了,學個C#絕對比VB強。
慣例先介紹一下VB1.0,這是微軟搞出來的語言,這語言與一般認識中的不一樣,出現(xiàn)的相當晚,1991年才出現(xiàn),和現(xiàn)在正在火的Python是同年出現(xiàn)的語言。同樣的,VB也是一個面向對象的語言。目前不少工業(yè)設計軟件和微軟自己的軟件的插件開發(fā)基本都需要用到VB,比如ppt插件之類的?,F(xiàn)在的VB和.NET綁定起來了,VB的編譯器會直接編譯出.NET下運行的程序,你的程序實際上是依賴.NET運行時的,然而C#顯然能以更優(yōu)良的語法寫出同樣依賴.NET運行時的程序,這也就是我說為啥不如學個C#的原因。

VB的開發(fā)環(huán)境
可以去微軟官網(wǎng)看一下,VB最推薦的開發(fā)環(huán)境是Visual Studio,下載地址:https://visualstudio.microsoft.com/zh-hans/。我最開始嘗試用VScode加插件,手動下載.NET SDK來進行編譯,但是似乎很麻煩,我暫時也沒跑起來,所以省事起見,直接下VS配置開發(fā)環(huán)境比較快。

下載好以后啟動VS,新建一個項目:

選擇VB控制臺應用,帶.NET的那個

下面填項目的名稱,解決方案的名稱,我理解的就是解決方案名稱就是這個項目整個最外層的文件夾的名稱,而項目名稱是默認給你創(chuàng)建的模塊的名稱。

我原來沒用過VS,一般都用的VScode,所以一進VS,就被默認字體驚到了,先改一下字體再說:


VScode默認的字體就是這個Lucida Console的加粗版,如果有更喜歡的字體擱這里面改就完事了。
2.語法
2.0.在哪寫代碼?
在VB中,程序的入口同樣是Main()函數(shù),因此在生成的模塊中有一個Main()函數(shù),程序從這里開始執(zhí)行,代碼應該寫在這里。
2.1.變量
VB是弱類型語言,常見的類型關鍵詞如下圖:

到這里你發(fā)現(xiàn)了,VB所有關鍵詞首字母都需要大寫,好在VS貼心的幫你提供了自動轉大寫功能,所以你只需要敲它的小寫然后讓VS給你轉大寫即可。
如何聲明一個變量呢?
這里也約定一下,后續(xù)尖括號里的內容代表你可以替換的內容,方括號的內容代表你可以省略的內容。在VB中,你定義變量時可以:
a)指定它的類型但不指定它的值,
b)既指定它的類型也指定它的值,
c)只指定它的值而不指定它的類型,此時編譯器會幫你猜一個類型出來。
下面看一下代碼:

2.2.輸入輸出
VB中輸入輸出各提供了兩個函數(shù),都由Console模塊提供:

Read只接收下一個字符,返回值為整型,如果沒接收到就是-1,而ReadLine會接收下一行的字符串。
Write打印結束后不會追加回車符,而WriteLine在打印結束后會追加回車符。

最后多加了個Read是為了阻止程序在結束后自動退出,沒有其他意義。
2.3.判斷
我直接貼個代碼片段,然后再說:

其實已經(jīng)一目了然了,就是:
elseif和else都可要可不要,但是一定要有if。由于沒有花括號或者縮進用來表示語句塊,因此VB需要End xx來表示上述語句塊結束。
同時其實VB提供了一個三目運算符的替代函數(shù),叫做IIf(),用法如下:

函數(shù)中第一個參數(shù)為布爾值,第二個參數(shù)為傳入布爾值為True時的返回值,第三個參數(shù)為傳入的布爾值為False時的返回值。它怎么實現(xiàn)的我不清楚,但是我現(xiàn)在可以實現(xiàn)一個相同功能的函數(shù):

2.4.循環(huán)
VB提供了while和for循環(huán),for的和C語言的不像,而是和Python的比較像。

for語句可以結合一個新的關鍵詞to使用,用來生成從n到m次循環(huán):

for結尾不用end for,而是next,這里需要注意下
此外for的經(jīng)典用法就是枚舉數(shù)組中的內容,數(shù)組下一節(jié)細說,這里先借用下:

for可以在每次循環(huán)把數(shù)組i中的下一個值給賦給num來使用。
2.5.數(shù)組
既然說到數(shù)組了,就提一下,VB中的數(shù)組聲明和C很像,唯一差別就是C中是中括號,而VB中是小括號。此時As后跟的類型就是數(shù)組中元素的類型。只有兩種情況:
a)只指定數(shù)組長度
b)只指定數(shù)組元素,此時編譯器會自動計算數(shù)組長度

如果你想:
c)既指定數(shù)組元素也指定數(shù)組長度
那么就會報錯,提示中也告訴你為啥了:

數(shù)組的使用沒啥,就是通過下標可以訪問或者修改:

這里要注意一件事,就是字符數(shù)組。根據(jù)我昨天一下午的測試,VB中的字符串和字符數(shù)組區(qū)別不大,字符串甚至可以隱式的與字符數(shù)組互相轉換。同時兩者中誰都能直接用索引,但是如果想調用字符串方法,如reverse,那么最好使用字符數(shù)組。
字符串可以用ToCharArray方法轉為字符數(shù)組。
2.6.函數(shù)
其實默認的Sub關鍵字不能有返回值,稱作函數(shù)有點牽強,官方管這個東西叫做子程序。它除了沒有返回值,和函數(shù)基本一模一樣。如果想要返回值,那么就應該用Function關鍵字聲明函數(shù)。
沒啥好說的,和其他語言的函數(shù)一個作用。
2.7.類
雖然我覺得我做二次開發(fā)基本用不到面向對象,但是還是大約記錄一下,萬一用到了呢
曾經(jīng)我寫過一個數(shù)學建模題,講的是兩個站點之間有n輛公交車,每輛公交車都最大只能帶走m個人,公交車在兩個站點之間的速度是k,站點A和站點B不同時段的人數(shù)不同,讓你規(guī)劃一個公交車的時刻表,既可以將所有人都拉走,同時要保證公交車空下的座位最少。具體的數(shù)字我已經(jīng)記不清了。這個題不出意外的話應該是有純數(shù)學的解析解的。但是從面向對象的思路考慮,那就應該是把這n輛公交車和這2個站點都當作對象,每個公交車都有屬于自己的m個座位,以及自己當前距離某個站點的距離和朝向。同時站點只負責維護兩個關于公交車和候車人數(shù)的屬性即可。在時間允許的情況下,兩個站點放入不同數(shù)量的公交車,將當天的所有公交車的線路仿真出來即可找到最優(yōu)解。
我個人覺得面向對象的優(yōu)點是看得清楚,如果沒有對象的概念,那么很多數(shù)據(jù)就會攪在一起,當代碼數(shù)量變長時再修改就會非常困難,因為你找不到當時設計的是哪個,而面向對象不關心把所有從一個模子刻出來的勢力,僅僅關注這個模具合不合適。

在類中想要聲明一個新屬性就使用
如果聲明方法那就和寫一個函數(shù)沒區(qū)別。
這里舉個例子,我老舉這個例子:

定義一個Dog類,這個類只有兩個屬性,一個是名字,一個是體重,而這個類只有兩個方法,一個是吃,吃了以后體重會加0.1,而另一個類則是檢查體重。
那么下面需要在主函數(shù)使用這個Dog類:

首先先要定義一個變量,這個變量的類型就是類名,然后new一個新的類給這個變量,就創(chuàng)建好了一個獨立的,不受影響的實例了。
這個程序使用MyDog類創(chuàng)建了兩只狗,一只叫oran,一只叫flo,而第一只狗調用10次吃的方法,第二只狗只調用一次,隨后再檢查兩只狗的體重,發(fā)現(xiàn)oran的體重為11,而flo的體重為10.1,也就是說兩只狗雖然調用的一模一樣的方法,但是它們兩個的屬性全部是獨立的。因此對某一個類調用方法是不會影響到其它類的,這樣就保證了類內的數(shù)據(jù)安全。