Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Di Visual Basic, Anda bisa meneruskan argumen ke prosedur menurut nilai atau berdasarkan referensi. Ini dikenal sebagai mekanisme passing, dan menentukan apakah prosedur dapat memodifikasi elemen pemrograman yang mendasari argumen tersebut dalam kode panggilan. Deklarasi prosedur menentukan mekanisme passing untuk setiap parameter dengan menentukan kata kunci ByVal atau ByRef .
Perbedaan
Saat meneruskan argumen ke prosedur, waspadai beberapa perbedaan berbeda yang berinteraksi satu sama lain:
Apakah elemen pemrograman yang mendasar dapat dimodifikasi atau tidak dapat dimodifikasi
Apakah argumen itu sendiri dapat dimodifikasi atau tidak dapat dimodifikasi
Apakah argumen sedang diteruskan dengan nilai atau dengan referensi
Apakah tipe data argumen adalah tipe nilai atau tipe referensi
Untuk informasi selengkapnya, lihat Perbedaan Antara Argumen yang Dapat Dimodifikasi dan yang Tidak Dapat Dimodifikasi dan Perbedaan Antara Meneruskan Argumen Menurut Nilai dan Menurut Referensi.
Pilihan Mekanisme Passing
Anda harus memilih mekanisme pemindahan dengan hati-hati untuk setiap argumen.
Perlindungan. Dalam memilih antara dua mekanisme pemanggilan, kriteria yang paling penting adalah seberapa jauh variabel yang dipanggil terkena perubahan. Keuntungan meneruskan argumen
ByRef
adalah bahwa prosedur dapat mengembalikan nilai ke kode panggilan melalui argumen tersebut. Keuntungan meneruskan argumenByVal
adalah melindungi variabel agar tidak diubah oleh prosedur.Performa. Meskipun mekanisme passing dapat memengaruhi performa kode Anda, perbedaannya biasanya tidak signifikan. Satu pengecualian untuk ini adalah tipe nilai yang diteruskan
ByVal
. Dalam hal ini, Visual Basic menyalin seluruh konten data argumen. Oleh karena itu, untuk tipe nilai besar seperti struktur, bisa lebih efisien jika meneruskannyaByRef
.Untuk jenis referensi, hanya penunjuk ke data yang disalin (empat byte pada platform 32-bit, delapan byte pada platform 64-bit). Oleh karena itu, Anda dapat meneruskan argumen jenis
String
atauObject
berdasarkan nilai tanpa merugikan performa.
Penentuan Sistem Kelulusan
Deklarasi prosedur menentukan mekanisme pengiriman untuk setiap parameter. Kode panggilan tidak dapat menggantikan ByVal
mekanisme.
Jika parameter dideklarasikan dengan ByRef
, kode panggilan dapat memaksa mekanisme ByVal
dengan menyertakan nama argumen dalam tanda kurung dalam panggilan. Untuk informasi selengkapnya, lihat Cara: Memaksa Argumen untuk Diteruskan berdasarkan Nilai.
Default dalam Visual Basic adalah meneruskan argumen berdasarkan nilai.
Kapan harus memberikan argumen berdasarkan nilai
Jika elemen kode panggilan yang mendasar argumen adalah elemen yang tidak dapat dimodifikasi, deklarasikan parameter yang sesuai ByVal. Tidak ada kode yang dapat mengubah nilai elemen yang tidak dapat dimodifikasi.
Jika elemen yang mendasar dapat dimodifikasi, tetapi Anda tidak ingin prosedur dapat mengubah nilainya, nyatakan parameter
ByVal
. Hanya kode panggilan yang dapat mengubah nilai elemen yang dapat dimodifikasi yang diteruskan oleh nilai.
Kapan Sebaiknya Meneruskan Argumen Melalui Referensi
Jika prosedur memiliki kebutuhan asli untuk mengubah elemen yang mendasar dalam kode panggilan, deklarasikan parameter yang sesuai ByRef.
Jika eksekusi kode yang benar tergantung pada prosedur yang mengubah elemen yang mendasar dalam kode panggilan, nyatakan parameter
ByRef
. Jika Anda meneruskannya berdasarkan nilai, atau jika kode panggilan mengubah mekanisme passingByRef
dengan membungkus argumen dalam tanda kurung, panggilan prosedur mungkin menghasilkan hasil yang mungkin tidak seperti yang diharapkan.
Contoh
Deskripsi
Contoh berikut mengilustrasikan kapan harus meneruskan argumen menurut nilai dan kapan harus meneruskannya berdasarkan referensi. Prosedur Calculate
memiliki baik ByVal
dan ByRef
sebagai parameter. Mengacu pada suku bunga, rate
, dan sejumlah uang, debt
, tugas prosedur ini adalah menghitung nilai baru untuk debt
, yang merupakan hasil dari penerapan suku bunga terhadap nilai asli debt
. Karena debt
adalah ByRef
parameter, total baru tercermin dalam nilai argumen dalam kode panggilan yang sesuai dengan debt
. Parameter rate
adalah ByVal
parameter karena Calculate
tidak boleh mengubah nilainya.
Kode
Module Module1
Sub Main()
' Two interest rates are declared, one a constant and one a
' variable.
Const highRate As Double = 12.5
Dim lowRate = highRate * 0.6
Dim initialDebt = 4999.99
' Make a copy of the original value of the debt.
Dim debtWithInterest = initialDebt
' Calculate the total debt with the high interest rate applied.
' Argument highRate is a constant, which is appropriate for a
' ByVal parameter. Argument debtWithInterest must be a variable
' because the procedure will change its value to the calculated
' total with interest applied.
Calculate(highRate, debtWithInterest)
' Format the result to represent currency, and display it.
Dim debtString = Format(debtWithInterest, "C")
Console.WriteLine("What I owe with high interest: " & debtString)
' Repeat the process with lowRate. Argument lowRate is not a
' constant, but the ByVal parameter protects it from accidental
' or intentional change by the procedure.
' Set debtWithInterest back to the original value.
debtWithInterest = initialDebt
Calculate(lowRate, debtWithInterest)
debtString = Format(debtWithInterest, "C")
Console.WriteLine("What I owe with low interest: " & debtString)
End Sub
' Parameter rate is a ByVal parameter because the procedure should
' not change the value of the corresponding argument in the
' calling code.
' The calculated value of the debt parameter, however, should be
' reflected in the value of the corresponding argument in the
' calling code. Therefore, it must be declared ByRef.
Sub Calculate(ByVal rate As Double, ByRef debt As Double)
debt = debt + (debt * rate / 100)
End Sub
End Module
Lihat juga
- Prosedur
- Parameter prosedur dan Argumen
- Cara: Meneruskan Argumen ke Prosedur
- Cara: Mengubah Nilai Argumen Prosedur
- Cara: Melindungi Argumen Prosedur Terhadap Perubahan Nilai
- Cara: Memaksa Argumen untuk Diteruskan sebagai Nilai
- Meneruskan Argumen menurut Posisi dan berdasarkan Nama
- Jenis Nilai dan Tipe Referensi