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 mendasari 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 seperti itu.

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 berdasarkan nilai, atau tidak mengapitnya dalam tanda kurung untuk meneruskannya dengan referensi. Untuk informasi selengkapnya, lihat Cara: Memaksa Argumen untuk Diteruskan oleh Nilai.

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. Namun, penetapan ulang tidak memengaruhi variabel larik yang mendasarinya 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(n): 11, 21, 31, 41". Karena array n adalah jenis referensi, increase dapat mengubah anggotanya, meskipun mekanisme passing adalah ByVal.

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

Mengkompilasi kode

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.

Lihat juga