Bagikan melalui


Meneruskan Argumen Berdasarkan Nilai dan Referensi (Visual Basic)

Di Visual Basic, Anda dapat meneruskan argumen ke prosedur berdasarkan nilai atau berdasarkan referensi. Ini dikenal sebagai mekanisme penerusan, dan menentukan apakah prosedur dapat memodifikasi elemen pemrograman yang mendasari argumen dalam kode panggilan. Deklarasi prosedur menentukan mekanisme penerusan untuk setiap parameter dengan menentukan kata kunci ByVal atau ByRef.

Perbedaan

Saat meneruskan argumen ke prosedur, perhatikan beberapa perbedaan yang berinteraksi satu sama lain:

  • Apakah elemen pemrograman yang mendasarinya dapat dimodifikasi atau tidak dapat dimodifikasi

  • Apakah argumen itu sendiri dapat dimodifikasi atau tidak dapat dimodifikasi

  • Apakah argumen sedang diteruskan berdasarkan nilai atau berdasarkan referensi

  • Apakah jenis data argumen adalah jenis nilai atau jenis referensi

Untuk informasi selengkapnya, lihat Perbedaan Antara Argumen yang Dapat Dimodifikasi dan Tidak Dapat Dimodifikasi dan Perbedaan Antara Penerusan Argumen Berdasarkan Nilai dan Berdasarkan Referensi.

Pilihan Mekanisme Penerusan

Anda harus memilih mekanisme penerusan dengan hati-hati untuk setiap argumen.

  • Perlindungan. Dalam memilih antara dua mekanisme penerusan, kriteria yang paling penting adalah paparan variabel panggilan untuk diubah. Keuntungan meneruskan argumen ByRef adalah bahwa prosedur dapat mengembalikan nilai ke kode panggilan melalui argumen tersebut. Keuntungan penerusan argumen ByVal adalah melindungi variabel agar tidak diubah oleh prosedur.

  • Performa. Meskipun mekanisme penerusan dapat memengaruhi performa kode Anda, perbedaannya biasanya tidak signifikan. Satu pengecualian untuk ini adalah jenis nilai yang diteruskan ByVal. Dalam hal ini, Visual Basic menyalin seluruh konten data argumen. Oleh karena itu, untuk jenis nilai besar seperti struktur, mungkin 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 membahayakan performa.

Penentuan Mekanisme Penerusan

Deklarasi prosedur menentukan mekanisme penerusan untuk setiap parameter. Kode panggilan tidak dapat mengambil alih mekanisme ByVal.

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 oleh Nilai.

Default dalam Visual Basic adalah meneruskan argumen menurut nilai.

Kapan harus Meneruskan Argumen berdasarkan Nilai

  • Jika elemen kode panggilan yang mendasari 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 mendasari 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 berdasarkan nilai.

Kapan harus Meneruskan Argumen berdasarkan Referensi

  • Jika prosedur memiliki kebutuhan asli untuk mengubah elemen yang mendasarinya dalam kode panggilan, deklarasikan parameter ByRef yang sesuai.

  • Jika eksekusi kode yang benar tergantung pada prosedur yang mengubah elemen yang mendasari dalam kode panggilan, nyatakan parameter ByRef. Jika Anda meneruskannya berdasarkan nilai, atau jika kode panggilan mengambil alih mekanisme penerusan ByRef dengan mengapit argumen dalam tanda kurung, panggilan prosedur mungkin menghasilkan hasil yang tidak terduga.

Contoh

Deskripsi

Contoh berikut mengilustrasikan kapan harus meneruskan argumen berdasarkan nilai dan kapan harus meneruskannya berdasarkan referensi. Prosedur Calculate memiliki parameter ByVal dan ByRef. Mengingat suku bunga, rate, dan jumlah uang, debt, tugas prosedur adalah menghitung nilai baru untuk debt yang merupakan hasil penerapan suku bunga ke nilai asli debt. Karena debt adalah parameter ByRef, total baru tercermin dalam nilai argumen dalam kode panggilan yang sesuai dengan debt. Parameter rate adalah parameter ByVal 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