引用 | 編輯
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發表的 : 那推薦您至小雄資訊網查查看 在教學區裡面可以找到網站連結 ^^ x0 |