[求助] vb 自定函數的 call byval (傳值呼叫) 到底有何用途 ?

Home Home
引用 | 編輯 flyspring
2005-03-17 13:58
樓主
推文 x0
除了保留原值以外,真的想不出 call byval 的作用,實 ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 ziele
2005-03-17 17:14
1樓
  
傳值呼叫(ByVal)
用數值來傳遞引數時,傳遞的只是變數的副本。如果程序改變了這個數值,則所做變動只影響副本而不會影響變數本身。用 ByVal 關鍵字可指出引數是用數值來傳遞的。
例如:
Sub PostAccounts (ByVal intAcctNum as Integer)
     .
     . ' 陳述式放這裡。
     .
End Sub
     ..
傳址呼叫 (ByRef)
傳址呼叫可以讓程序直接存取變數在記憶體位址中的實際內容。因此,將變數傳遞給程序後,程序對變數值的改變將可以保留。引數的傳遞在 Visual Basic 中是預設為傳址呼叫。
如果您對傳址呼叫的引數指定資料型態,就必須傳遞這種型態的數值給引數。您也可以將運算式當成引數傳遞過去,而不是具有資料型態的引數。Visual Basic 會計算運算式,如果可能的話,還會按所要求的型態將結果傳遞給引數。
把變數轉換成運算式的最簡單的方法就是把它放在括號內。舉例而言,若要把宣告為整數的變數傳遞給只接受字串為引數的程序,則可以用下面的敘述:
Sub CallingProcedure ()
     Dim intX As Integer
     intX = 12 * 3
     Foo (intX)
End Sub

Sub Foo (Bar As String)
     MsgBox Bar      ' Bar 的值為字串‘ 36 ’。
End Sub
----------------------------------------------------------------------------------------------------------------------------------------
外部參數傳遞比在處理內傳遞參數要來的慢,特別是參數用引用傳遞時。由於指標無法從一個位址空間直接傳到另一個位址空間中,因此必須先傳遞一份副本給元件的位址空間。當方法執行完成後,還得將該資料複製傳回。
選擇 ByVal 還是 ByRef
因為一些外部參數傳遞的問題需要考量,因此在跨處理序元件中,某些方法的引數應該宣告為 ByVal,而在同處理序元件中則應該宣告為 ByRef,如下所述。
物件引用
在宣告由跨處理序元件提供的物件之方法時,請使用 ByVal 來宣告存放物件引用的引數。
這是由於如果跨處理序外部參數傳遞傳送的物件引用是單向傳遞時,其所需的額外執行時間將會較少。用 ByRef 來定義一個引數代表著不僅物件引用必須跨處理序傳遞給元件,在方法結束之後還要將其傳回給客戶端。
只有在您需要用另一個物件的引用來替代客戶端的物件引用的時候,才需要在宣告存放物件引用的引數時使用 ByRef。

獻花 x0
引用 | 編輯 jijifeng
2005-03-18 08:22
2樓
  
感謝囉…當初我看書的時候也一直對這兩個不太瞭解…
後來好不容易搞懂了說…
總而言之,ByVal就是把直傳過去…本身的數值不會變化吧…
ByRef就是把數傳過去運算完,會再回傳回來…因此數值會變化…

請高手指教,不知道這樣解釋對不對呢…

獻花 x0
引用 | 編輯 flyspring
2005-03-18 09:20
3樓
  
不好意思,我是原發問者,當時想破頭,急著要找答案,終於想到了。(感謝 ziele 大大的回答,不過我要的不是解釋或定義,我是要實例說明的)。

我會問這個問題,是因為我覺得 byval 好像沒什麼用途,後來我想到它還是有用的,

byval 的用途實例: 輸入學生成績時,通常是以座號為排序,但如果要算總成績排名時就可以用 byval 把陣列的值送到 sub 中改用名次排序並顯示或列印出來,但回來主程式時,原值並未被改變,也就是資料仍然依座號排序的,這不就是 byval 的實例運用了嗎 ? (同理可用在業績排名上)

獻花 x0
引用 | 編輯 panasonic732
2005-03-18 09:28
4樓
  
下面是引用flyspring於2005-03-18 09:20發表的 :
不好意思,我是原發問者,當時想破頭,急著要找答案,終於想到了。(感謝 ziele 大大的回答,不過我要的不是解釋或定義,我是要實例說明的)。

我會問這個問題,是因為我覺得 byval 好像沒什麼用途,後來我想到它還是有用的,

byval 的用途實例: 輸入學生成績時,通常是以座號為排序,但如果要算總成績排名時就可以用 byval 把陣列的值送到 sub 中改用名次排序並顯示或列印出來,但回來主程式時,原值並未被改變,也就是資料仍然依座號排序的,這不就是 byval 的實例運用了嗎 ? (同理可用在業績排名上)

那推薦您至小雄資訊網查查看

在教學區裡面可以找到網站連結 ^^

獻花 x0