Bagikan melalui


Meneruskan Argumen menurut Nilai dan berdasarkan Referensi (Visual Basic)

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 argumen ByVal 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 meneruskannya ByRef.

    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 atau Object 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 passing ByRef 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