2、過程參數傳遞
過程通常需要某些程序當前狀態(tài)的信息才能完成它的工作。程序當前狀態(tài)信息也包含在調用過程時傳遞到過程內的變量。當將變量傳遞到過程時(完成形式參數與實際參數的結合),稱變量為參數。
(1)參數的數據類型
過程的參數類型缺省為Variant數據類型。不過,也可以聲明參數為其它數據類型。例如:函數接受一個字符串變量和一個整型變量:
Function WhatForLunch(WeekDay As String,Hour As Integer) As String
If WeekDay="Saturday" then
WhatForLunch="Fish"
ELse
WhatForLunch="Chicken"
End If
If Hour>2 Then WhatForLunch="Sorry,It's too late!"
End Function
(2)按地址傳遞參數
按地址傳遞參數過程(也稱“引用”)使得過程通過變量的內存地址去訪問實際變量的內容。將變量傳遞給過程時,在過程中可改變變量的值。按地址傳遞參數在VB中是缺省的。
如果給按地址傳遞的參數指定數據類型,就必須將這種類型的值傳遞給參數,也可以給參數傳遞一個表達式,VB計算表達式,并按要求的類型將值傳遞給參數。
當變量通過地址傳遞時,對變量的任何修改都被傳遞給調用過程。傳址參數調用在修改調用過程中的變量方面具有顯著的優(yōu)點,只是不要在過程中無意地修改變量。
例如,下面的子過程聲明和調用:
Sub CostPlusInterest(Cost,Total)
Cost=Cost*1.05 'add 5% to Cost
Total=Int(Cost) 'then make integer and return
End Sub
調用:
……
Price=100
Total=0
Costplusinterest Price,Total
Print Price; "at 5% interest is ";Total
本例中,程序將兩個傳址變量傳遞給CostPlusInterest過程:Price和Total。程序員計劃在隨后的Print方法中使用更新的Total變量,但不慎忘掉了Price變量在過程的中間步驟中被更新,所以程序運行時,產生結果如下:
105 at 5% interest is 105
沒有達到預期的效果。
(3)按值傳遞參數
避免上述問題的一種好的做法是按值傳遞參數。按值傳遞參數傳遞的只是變量的副本。如果過程執(zhí)行過程中改變了這個值,則所有變動只影響副本而不會影響變量本身。使用ByVal關鍵字指出參數是按值來傳遞的。
例如:對上例加以修改,就不會發(fā)生上面出現的錯誤,改動如下:
Sub CostPlusInterest(ByVal Cost,Total)
當使用ByVal聲明Cost參數時,就會產生正確的結果:
100 at 5% interest is 105
如果不想依賴于ByVal關鍵字,也可以換一種方法防止所傳遞的變量被修改:將變量置于括弧內而把它轉換為文字值,如上例中,調用costplusinterest過程的語句為:
costplusinterest(price),total,
同樣可以得到正確結果。
再例如,有下面代碼:
Option Explicit
Function Multiply(ByVal n As Integer) As Integer
Multiply = 1
Do While n > 0
Multiply = Multiply * n '求n!
n = n - 1
Loop
End Function
Private Sub Form_Click()
Dim sum As Integer, i As Integer
For i = 5 To 1 Step -1
sum = sum + Multiply(i)
Next
Print "sum="; sum
End Sub
運行后結果為153(5!+4!+3!+2!+1?。?BR> 若將函數的參數n前的“ByVal”去掉,結果為120(5?。?,這顯然不是編者的初衷,是錯誤的。
究竟什么時候用傳值方式,什么時候用傳地址方式,沒有硬性規(guī)定。下面幾條規(guī)則可供參考:
1)對于整形、長整形或單精度參數,如果不希望過程修改實參的值,則應加上關鍵字ByVal(按值傳送)。而為了提高效率,字符串和數組應通過地址傳送。此外,用戶定義的類型(記錄類型)和控件只能通過地址傳送。
2)對于其它數據類型,包括雙精度型、貨幣型和變體數據類型,可以用兩種方式傳送。但經驗證明,此類參數用傳值方式傳送,這樣可以避免錯用參數。
3)如果沒有把握,用傳值方式傳送所有變量(字符串、數組和記錄類型變量除外),在編寫完程序并能正確運行后,再把部分參數改為傳地址,以加快運行速度。這樣,即使在刪除一些ByVal后,程序不能正確運行,也很容易查出錯在什么地方。
(4)使用可選的參數
VB提供了十分靈活和安全的參數傳送方式,允許使用可選參數和可變參數。在調用一個過程時,可以向過程傳送可選的參數或者任意數量的參數。
在前面的例子中,一個過程的形式參數(形參)是固定的,調用時提供的實際參數(實參)也是固定的。也就是說,如果一個過程有三個形參,則調用時必須按相同的順序和類型提供三個實參。
在VB中,可以指定一個或多個參數作為可選參數。例如,我們建立一個計算兩個數的乘積的過程,它能夠有選擇的乘以第三個數。在調用時,既可以給它傳送兩個參數,也可以給它傳送三個參數。
過程通常需要某些程序當前狀態(tài)的信息才能完成它的工作。程序當前狀態(tài)信息也包含在調用過程時傳遞到過程內的變量。當將變量傳遞到過程時(完成形式參數與實際參數的結合),稱變量為參數。
(1)參數的數據類型
過程的參數類型缺省為Variant數據類型。不過,也可以聲明參數為其它數據類型。例如:函數接受一個字符串變量和一個整型變量:
Function WhatForLunch(WeekDay As String,Hour As Integer) As String
If WeekDay="Saturday" then
WhatForLunch="Fish"
ELse
WhatForLunch="Chicken"
End If
If Hour>2 Then WhatForLunch="Sorry,It's too late!"
End Function
(2)按地址傳遞參數
按地址傳遞參數過程(也稱“引用”)使得過程通過變量的內存地址去訪問實際變量的內容。將變量傳遞給過程時,在過程中可改變變量的值。按地址傳遞參數在VB中是缺省的。
如果給按地址傳遞的參數指定數據類型,就必須將這種類型的值傳遞給參數,也可以給參數傳遞一個表達式,VB計算表達式,并按要求的類型將值傳遞給參數。
當變量通過地址傳遞時,對變量的任何修改都被傳遞給調用過程。傳址參數調用在修改調用過程中的變量方面具有顯著的優(yōu)點,只是不要在過程中無意地修改變量。
例如,下面的子過程聲明和調用:
Sub CostPlusInterest(Cost,Total)
Cost=Cost*1.05 'add 5% to Cost
Total=Int(Cost) 'then make integer and return
End Sub
調用:
……
Price=100
Total=0
Costplusinterest Price,Total
Print Price; "at 5% interest is ";Total
本例中,程序將兩個傳址變量傳遞給CostPlusInterest過程:Price和Total。程序員計劃在隨后的Print方法中使用更新的Total變量,但不慎忘掉了Price變量在過程的中間步驟中被更新,所以程序運行時,產生結果如下:
105 at 5% interest is 105
沒有達到預期的效果。
(3)按值傳遞參數
避免上述問題的一種好的做法是按值傳遞參數。按值傳遞參數傳遞的只是變量的副本。如果過程執(zhí)行過程中改變了這個值,則所有變動只影響副本而不會影響變量本身。使用ByVal關鍵字指出參數是按值來傳遞的。
例如:對上例加以修改,就不會發(fā)生上面出現的錯誤,改動如下:
Sub CostPlusInterest(ByVal Cost,Total)
當使用ByVal聲明Cost參數時,就會產生正確的結果:
100 at 5% interest is 105
如果不想依賴于ByVal關鍵字,也可以換一種方法防止所傳遞的變量被修改:將變量置于括弧內而把它轉換為文字值,如上例中,調用costplusinterest過程的語句為:
costplusinterest(price),total,
同樣可以得到正確結果。
再例如,有下面代碼:
Option Explicit
Function Multiply(ByVal n As Integer) As Integer
Multiply = 1
Do While n > 0
Multiply = Multiply * n '求n!
n = n - 1
Loop
End Function
Private Sub Form_Click()
Dim sum As Integer, i As Integer
For i = 5 To 1 Step -1
sum = sum + Multiply(i)
Next
Print "sum="; sum
End Sub
運行后結果為153(5!+4!+3!+2!+1?。?BR> 若將函數的參數n前的“ByVal”去掉,結果為120(5?。?,這顯然不是編者的初衷,是錯誤的。
究竟什么時候用傳值方式,什么時候用傳地址方式,沒有硬性規(guī)定。下面幾條規(guī)則可供參考:
1)對于整形、長整形或單精度參數,如果不希望過程修改實參的值,則應加上關鍵字ByVal(按值傳送)。而為了提高效率,字符串和數組應通過地址傳送。此外,用戶定義的類型(記錄類型)和控件只能通過地址傳送。
2)對于其它數據類型,包括雙精度型、貨幣型和變體數據類型,可以用兩種方式傳送。但經驗證明,此類參數用傳值方式傳送,這樣可以避免錯用參數。
3)如果沒有把握,用傳值方式傳送所有變量(字符串、數組和記錄類型變量除外),在編寫完程序并能正確運行后,再把部分參數改為傳地址,以加快運行速度。這樣,即使在刪除一些ByVal后,程序不能正確運行,也很容易查出錯在什么地方。
(4)使用可選的參數
VB提供了十分靈活和安全的參數傳送方式,允許使用可選參數和可變參數。在調用一個過程時,可以向過程傳送可選的參數或者任意數量的參數。
在前面的例子中,一個過程的形式參數(形參)是固定的,調用時提供的實際參數(實參)也是固定的。也就是說,如果一個過程有三個形參,則調用時必須按相同的順序和類型提供三個實參。
在VB中,可以指定一個或多個參數作為可選參數。例如,我們建立一個計算兩個數的乘積的過程,它能夠有選擇的乘以第三個數。在調用時,既可以給它傳送兩個參數,也可以給它傳送三個參數。

