Bagikan melalui


Cara: Mengubah Nilai Argumen Prosedur (Visual Basic)

Saat memanggil prosedur, setiap argumen yang Anda berikan sesuai dengan salah satu parameter yang ditentukan dalam prosedur. Dalam beberapa kasus, kode prosedur dapat mengubah nilai yang mendasari argumen dalam kode panggilan. Dalam kasus lain, prosedur hanya dapat mengubah salinan lokal argumen.

Saat Anda memanggil prosedur, Visual Basic membuat salinan lokal dari setiap argumen yang diteruskan ByVal. Untuk setiap argumen yang diteruskan ByRef, Visual Basic memberikan kode prosedur referensi langsung ke elemen pemrograman yang mendasari argumen dalam kode panggilan.

Jika elemen yang mendasari dalam kode panggilan adalah elemen yang dapat dimodifikasi dan argumen diteruskan ke ByRef, kode prosedur dapat menggunakan referensi langsung untuk mengubah nilai elemen dalam kode panggilan.

Mengubah Nilai yang Mendasari

Untuk mengubah nilai yang mendasari dari argumen prosedur dalam kode panggilan

  1. Dalam deklarasi prosedur, tentukan ByRef untuk parameter yang sesuai dengan argumen.

  2. Dalam kode panggilan, teruskan elemen pemrograman yang dapat dimodifikasi sebagai argumen.

  3. Dalam kode panggilan, jangan sertakan argumen dalam tanda kurung pada daftar argumen.

  4. Dalam kode prosedur, gunakan nama parameter untuk menetapkan nilai ke elemen yang mendasari dalam kode panggilan.

Lihat contoh lebih lanjut untuk demonstrasi.

Mengubah Salinan Lokal

Jika elemen yang mendasari dalam kode panggilan adalah elemen yang tidak dapat dimodifikasi, atau jika argumen diteruskan ke ByVal, prosedur tidak dapat mengubah nilainya dalam kode panggilan. Namun, prosedur dapat mengubah salinan lokal argumen tersebut.

Untuk mengubah salinan argumen prosedur dalam kode prosedur

  1. Dalam deklarasi prosedur, tentukan ByVal untuk parameter yang sesuai dengan argumen.

    -atau-

    Dalam kode panggilan, sertakan argumen dalam tanda kurung pada daftar argumen. Tindakan ini memaksa Visual Basic untuk meneruskan argumen menurut nilai, bahkan jika parameter yang sesuai menentukan ByRef.

  2. Dalam kode prosedur, gunakan nama parameter untuk menetapkan nilai ke salinan lokal argumen. Nilai yang mendasari dalam kode panggilan tidak diubah.

Contoh

Contoh berikut menentukan dua prosedur yang mengambil variabel array berdasarkan nilai dan beroperasi pada elemennya. Prosedur increase hanya menambah satu ke setiap elemen. Prosedur replace menetapkan array baru ke parameter a() lalu menambahkannya ke setiap elemen.

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByRef a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

Panggilan pertama MsgBox menampilkan "Setelah peningkatan(n): 11, 21, 31, 41". Karena array n adalah jenis referensi, replace dapat mengubah anggotanya, meskipun mekanisme passing adalah ByVal.

Panggilan MsgBox kedua menampilkan "After replace(n): 101, 201, 301". Karena n diteruskan ke ByRef, replace dapat mengubah variabel n dalam kode panggilan dan menetapkan array baru ke dalamnya. Karena n merupakan jenis referensi, replace juga dapat mengubah anggotanya.

Anda dapat mencegah prosedur agar tidak memodifikasi variabel dalam kode panggilan. Lihat Cara: Melindungi Argumen Prosedur Terhadap Perubahan Nilai.

Mengkompilasi kode

Ketika Anda meneruskan variabel berdasarkan referensi, Anda harus menggunakan kata kunci ByRef untuk menentukan mekanisme ini.

Default dalam Visual Basic adalah meneruskan argumen menurut nilai. Namun, merupakan praktik pemrograman yang baik untuk menyertakan kata kunci ByVal atau ByRef dengan setiap parameter yang dideklarasikan. Ini membuat kode Anda lebih mudah dibaca.

Keamanan .NET Framework

Selalu ada potensi risiko dalam memungkinkan prosedur untuk mengubah nilai yang mendasari argumen dalam kode panggilan. Pastikan Anda mengharapkan nilai ini diubah, dan bersiaplah untuk memeriksanya untuk validitas sebelum menggunakannya.

Lihat juga