VB考試教程:過程的使用之過程參數傳遞

字號:

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中,可以指定一個或多個參數作為可選參數。例如,我們建立一個計算兩個數的乘積的過程,它能夠有選擇的乘以第三個數。在調用時,既可以給它傳送兩個參數,也可以給它傳送三個參數。