Bagikan melalui


Cara: Melindungi Argumen Prosedur Terhadap Perubahan Nilai (Visual Basic)

Jika prosedur mendeklarasikan parameter sebagai ByRef, Visual Basic memberi kode prosedur referensi langsung ke elemen pemrograman yang mendasar argumen dalam kode panggilan. Ini memungkinkan prosedur untuk mengubah nilai yang mendasar argumen dalam kode panggilan. Dalam beberapa kasus, kode panggilan mungkin ingin melindungi dari perubahan tersebut.

Anda selalu dapat melindungi argumen dari perubahan dengan mendeklarasikan parameter terkait ByVal dalam prosedur. Jika Anda ingin dapat mengubah argumen tertentu dalam beberapa kasus tetapi bukan yang lain, Anda dapat mendeklarasikannya ByRef dan membiarkan kode panggilan menentukan mekanisme passing di setiap panggilan. Ini dilakukan dengan menyertakan argumen yang sesuai dalam tanda kurung untuk meneruskannya melalui nilai, atau tidak menyertakannya dalam tanda kurung untuk meneruskannya melalui referensi. Untuk informasi selengkapnya, lihat Cara: Memaksa Argumen untuk Diteruskan berdasarkan Nilai.

Contoh

Contoh berikut menunjukkan dua prosedur yang mengambil variabel array dan beroperasi pada elemennya. Prosedur increase ini dengan sederhana menambahkan satu ke setiap elemen. Prosedur menetapkan replace array baru ke parameter a() lalu menambahkannya ke setiap elemen. Namun, penetapan ulang tidak memengaruhi variabel array yang mendasar dalam kode panggilan.

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(ByVal 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 nilai n: 11, 21, 31, 41". Karena array n adalah jenis referensi, increase dapat mengubah anggotanya, meskipun mekanisme passing adalah ByVal.

Panggilan kedua MsgBox menampilkan "Setelah mengganti(n): 11, 21, 31, 41". Karena n diteruskan ByVal, replace tidak dapat mengubah variabel n dalam kode panggilan dengan menetapkan array baru ke dalamnya. Saat replace membuat instance array baru k dan menetapkannya ke variabel lokal a, kode kehilangan referensi ke n yang diteruskan oleh kode pemanggil. Ketika mengubah anggota a, hanya array k lokal yang terpengaruh. Oleh karena itu, replace tidak meningkatkan nilai array n dalam kode panggilan.

Mengkompilasi kode

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

Lihat juga