以傳值或傳址方式傳遞引數的差別
更新:2007 年 11 月
將一或多個引數傳遞至程序時,每個引數都對應至呼叫程式碼中的相對程式設計項目。您可傳遞這個對應項目的值或它的參考,這就是所謂的「傳遞機制」。
以傳值方式傳遞
在程序定義中指定對應參數的 ByVal 關鍵字,即可以「傳值」方式傳遞引數。使用這個傳遞機制時,Visual Basic 會將對應程式設計項目的值複製到程序中的區域變數,程序程式碼不會有對應項目的任何存取權。
以傳址方式傳遞
在程序定義中指定對應參數的 ByRef 關鍵字,即可用「傳址」方式傳遞引數。使用這個傳遞機制時,Visual Basic 會在呼叫程式碼中將對應程式設計項目的直接參考提供給程序。
傳遞機制和項目型別
傳遞機制的選擇與對應項目型別的分類不同,以傳值或傳址方式傳遞是指 Visual Basic 提供給程序程式碼的內容。實值型別 (Value Type) 或參考型別 (Reference Type) 指的是如何將程式設計項目儲存在記憶體中。
然而,傳遞機制與項目型別相互關連。參考型別的值是記憶體中其他位置的資料指標,這表示以傳值方式傳遞參考型別時,程序程式碼會有對應項目資料的指標,即使它無法存取對應項目本身。例如,如果項目是陣列變數,則程序程式碼不會有變數本身的存取權,但它可存取陣列成員。
修改的能力
當您將不可修改的項目當做引數傳遞時,無論此項目是以 ByVal 或 ByRef 方式傳遞,程序都不可以在呼叫程式碼中進行修改。
對於可修改的項目而言,下表彙總項目型別和傳遞機制之間的互動:
項目型別 |
透過 ByVal 傳遞 |
透過 ByRef 傳遞 |
---|---|---|
實值型別 (只包含一個值) |
程序無法變更變數或其任何成員 |
程序可以變更變數或成員 |
參考型別 (包含指向類別或結構執行個體的指標) |
程序無法變更變數,但可以變更它所指向的執行個體之成員 |
程序可以變更變數和它所指向的執行個體之成員 |