過程中的代碼通常需要某些關於程序狀態的信息才能完成它的工作。信息包括在調用過程時傳遞到過程內的變量。當將變量傳遞到過程時,稱變量為參數。
1.參數的數據類型
過程的參數被缺省為具有Object數據類型,不過,也可以聲明參數為其他數據類型。例如,下面的函數接受一個字符串和一個整數:
Function WhatsForLunch(WeekDay As String,Hour As Integer) As String '根據星期幾和時間,返回午餐菜單 If WeekDay="Friday" Then WhatsForLunch="Fish" Else WhatsForLunch="Chicken" End If If Hour>4 Then WhatsForLunch="Too Late" End Function
2.按值傳遞參數
按值傳遞參數方式在vb.net中是缺省的。按值傳遞參數時,傳遞的只是變量的副本。如果過程改變了這個值,則所作變動只影響副本而不會影響變量本身。用“ByVal”關鍵字指出參數是按值來傳遞的。例如:
Sub PostAccounts(ByVal intAcctNum As Integer) '這裡放語句 End Sub 注意:ByVal關鍵字可以省略。
3.按地址傳遞參數
按地址傳遞參數是過程用變量的內存地址去訪問實際變量的內容。結果,將變量傳遞給過程時,通過過程可改變變量值。按地址傳遞參數如果給按地址傳遞參數指定數據類型,就必須將這種類型的值傳給參數。Visual Basic計算表達式,如果可能的話,還會按要求的類型將值傳遞給參數。把變量轉換成表達式的最簡單的方法就是把它放在括號內。用“ByRef”關鍵字指出參數是按地址來傳遞的,按地址傳遞的效率比較高,因為,無論變量是什麼類型,傳進的都只是4個字節。如下例:參數“RunningTotal”是按地址傳進來的,因此傳進的變量值為參數“AcctNum”的值。
Sub PostAccount(ByVal AcctNum As Integer,ByRef RunningTotal As Single) RunningTotal=AcctNum End Sub
4.使用可選的參數
在過程的參數列表中列入“Optional”關鍵字,就可以指定過程的參數為可選的。指定可選參數,根據以下三條規則:
(1)每個可選的參數一定要有一個缺省值;
(2)可選參數的缺省值必須是個常數;
(3)可選參數的後面的所有參數也需是可選參數
下面的例子給出了帶有可選參數的過程的定義:
Sub subName(Optional ByVal MyCountry As String="China")
....
End Sub
當調用這個過程的時候,可以選擇是否給過程傳遞參數,如果不傳遞參數,則過程使用缺省的參數。
有的時候也許不想給可選參數傳值,而且也不希望使用缺省值,但這種情況Visual Basic是不允許的,這時只要給可選參數設定一個不會用到的缺省值就可以解決這個問題了,如下例:
Sub PlaceInfo(ByVal State As String,Optional ByVal Country As String="QJx") If Country="QJZ" Then Debug.WriteLine("Country not supplied-using Australia") Country="Australia" End If MsgBox("The state of"&State&"is in"&Country) End Sub
可以這樣調用這個過程:
PlaceInfo(state:="Maryland",Country:="USA")
'...
PlaceInfo(State:="Queensland")
5.使用不定數量的參數
一般來說,過程調用中的參數個數應等於過程說明的參數個數。可用一個參數數組向過程傳遞參數,當定義過程時候,不必知道參數數組中的元素的個數,參數數組的大小由每次調用過程時決定。
用關鍵字“ParamArray”表示數組參數,其規則如下:
(1)一個過程只能有一個參數數組,而且參數數組必須在其他參數的後面。
(2)參數數組必須是按值傳遞的,在過程定義此參數數組時,明確有關鍵字“ByVal”。
(3)參數數組必須是一維數組,參數數組本身的每個元素必須是同一種類型的,如果沒定義,按Object類型處理。
(4)參數數組一旦聲明就是可選參數,它的缺省值就是每種類型的Empty值。
下面例子說明了參數數組的使用:
Sub StudentScores(Name As String,ByVal ParmArray Scores() As Object) Dim I As Integer Debug.WriteLine("Scores for"&Name&":") 'Use UBound function to determine largest subscript of array For I=0 To UBound(Scores()) Debug.WriteLine("score"&I&":"&Scores(I)) Next I End Sub 可以這樣調用這個過程: StudentScores("Jamie",10,26,32,15,22,24,16) '... StudentScores("Kelly","High","Low","Average","High")