Pengubah Parameter Pada Method Di C#

pengubah parameter pada method di c#

Halo! Selamat datang kembali di “Seri Belajar Dasar Pemrograman Bahasa C#“. Setelah sebelumnya mempelajari bagaimana mendefinisikan dan memanggil sebuah method di C#, kali ini kita akan mempelajari beberapa pengubah parameter pada method di C# (parameters modifier) seperti refout, dan params.

Method Tanpa Pengubah Parameter

Katakanlah kita memiliki dua variabel string str1 dan str2 yang masing-masing bernilai “Flip” dan “Flop” secara berurutan, seperti pada kode program di bawah ini.

string str1 = "Flip", str2 = "Flop";

Lalu, kita diminta untuk membuat sebuah method untuk menukar nilai str1 dengan str2 dan juga sebaliknya. Dengan pengetahuan kita sampai saat ini, tanpa berpikir panjang, kita akan membuat sebuah method seperti di bawah ini.

static void TukarString(string s1, string s2)
{
    string tempStr = s1;
    s1 = s2;
    s2 = tempStr;
}

Pertama-tama kita perlu membuat sebuah variabel lokal untuk menampung sementara nilai dari parameter string s1, yaitu tempStr. Baru setelah itu, kita bisa mengganti nilai s1 dengan nilai parameter s2. Terakhir, kita mengganti nilai s2 dengan nilai variabel tempStr yang sebelumnya telah kita tetapkan dengan nilai dari s1.

Bagus! Sekarang kita sudah mempunyai sebuah method untuk menukar nilai dari dua variabel string. Saatnya memanggil method tersebut dari Main().

using System;

namespace PengubahParameter
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "Flip", str2 = "Flop";

            Console.WriteLine($"Sebelum memanggil method TukarString(): str1 = {str1}, str2 = {str2}");
            TukarString(str1, str2);
            Console.WriteLine($"Setelah memanggil method TukarString(): str1 = {str1}, str2 = {str2}");
        }
    }
}

Sayangnya, kode program di atas tidak menghasilkan keluaran yang sesuai dengan ekspektasi.

Sebelum memanggil method TukarString(): str1 = Flip, str2 = Flop
Setelah memanggil method TukarString(): str1 = Flip, str2 = Flop

Sepertinya method TukarString() tidak berfungsi sebagaimana mestinya. Nilai variabel str1 dan str2 sama sekali tidak berubah meskipun telah kita berikan kepada method TukarString() sebagai argumen.

Masalah ini bisa kita atasi dengan melakukan sedikit modifikasi pada parameter method TukarString() seperti yang akan kita pelajari selanjutnya.

Pengubah Parameter ref

Jadi, mengapa method TukarString() sebelumnya tidak berfungsi dengan semestinya?

Tanpa pengubah parameter (parameters modifier) apapun, parameter pada sebuah method hanya akan menerima nilai literal dari sebuah variabel sebagai argumen. Maksudnya, jika kita memberikan variabel str1 dan str2 sebagai argumen untuk method TukarString(), maka hanya nilai literal dari kedua variabel tersebut, yaitu “Flip” dan “Flop”, yang akan disalin ke parameter s1 dan s2 pada method TukarString().

Dengan demikian, parameter s1 dan s2 hanya merupakan salinan dari nilai literal variabel str1 dan str2. Parameter s1 dan s2 sama sekali tidak mengetahui informasi apapun tentang variabel str1 dan str2 kecuali hanya nilai literalnya saja.

Oleh karena itulah, nilai variabel str1 dan str2 sama sekali tidak tertukar meskipun kita telah memberikannya ke method TukarString() sebagai argumen.

Untuk mendapatkan hasil yang sesuai dengan ekspektasi, kita perlu membuat parameter s1 dan s2 menyalin alamat/lokasi di mana variabel str1 dan str2 disimpan di dalam memori. Dengan demikian, parameter s1 dan s2 nantinya bisa menjadi referensi bagi method TukarString() untuk mengubah nilai variabel str1 dan str2.

Agar parameter s1 dan s2 bisa mendapatkan informasi mengenai alamat memori dari variabel str1 dan str2, kita bisa bisa melakukan sedikit modifikasi pada kedua parameter tersebut dengan menambahkan kata kunci ref.

Ubah method TukarString() sebelumnya menjadi seperti kode program di bawah ini. Perhatikan kata kunci ref pada masing-masing parameter s1 dan s2.

static void TukarString(ref string s1, ref string s2)
{
    string tempStr = s1;
    s1 = s2;
    s2 = tempStr;
}

Ubah juga kode program untuk memanggil method TukarString() di dalam method Main() dari:

TukarString(str1, str2);

menjadi seperti ini:

TukarString(ref str1, ref str2);

Kali ini kita akan mendapatkan keluaran yang sesuai dengan ekspektasi apabila kode program tersebut kita jalankan.

Sebelum memanggil method TukarString(): str1 = Flip, str2 = Flop
Setelah memanggil method TukarString(): str1 = Flop, str2 = Flip

Dengan menggunakan pengubah parameter ref, berarti kita memberitahu compiler bahwa parameter s1 dan s2 kali ini kita minta untuk menyalin alamat/lokasi memori variabel str1 dan str2, bukan menyalin nilai literalnya.

Karena kini method TukarString() memiliki referensi ke lokasi variabel str1 dan str2 melalui parameter s1 dan s2, memodifikasi kedua parameter tersebut juga akan mengubah nilai literal dari variabel str1 dan str2.

Catatan: Untuk memperdalam pengetahuan Anda tentang kedua materi di atas. Anda bisa mempelajari materi tentang “Memahami Pass By Value Dan Pass By Reference Di C#”.

Hal Yang Perlu Diperhatikan Dari Penggunaan Pengubah Parameter ref

Beberapa hal yang perlu diperhatikan pada saat menggunakan pengubah parameter ref adalah, argumen yang diberikan harus berupa sebuah variabel. Kode program di bawah ini akan menghasilkan error karena kita menggunakan konstanta (dalam hal ini sebuah teks) sebagai argumen.

TukarString(ref "Flip", ref "Flop");

Selain itu, variabel yang akan kita berikan sebagai argumen ke parameter ref harus diinisialisasi terlebih dahulu. Kode program di bawah ini akan menghasilkan eror karena variabel str1 dan str2 tidak diinisialisasi terlebih dahulu sebelum diberikan sebagai argumen.

string str1, str2;
TukarString(ref str1, ref str2);

Pengubah Parameter out

Selain ref, pengubah parameter pada method di C# yang bisa kita gunakan adalah out.

Sama halnya ketika menggunakan pengubah parameter ref, kita juga mengharapkan sebuah variabel mendapatkan nilai baru ketika menggunakan parameter out.

Kode program di bawah ini mendemonstrasikan bagaimana menggunakan pengubah parameter out pada sebuah method.

static void Penambahan(int x, int y, out int hasil)
{
    hasil = x + y;
}

Untuk menggunakan (memanggil) method tersebut, kita bisa menambahkan kode program di bawah ini di dalam method Main().

int angka1 = 10, angka2 = 15;
int hasil;

Penambahan(angka1, angka2, out hasil);
Console.WriteLine($"{angka1} + {angka2} = {hasil}");

// Output: 10 + 15 = 25

Kode program di atas bisa kita ringkas dengan cara mendeklarasikan variabel hasil langsung pada argumennya seperti yang ditunjukkan di baris ketiga kode program di bawah ini.

int angka1 = 10, angka2 = 15;

Penambahan(angka1, angka2, out int hasil); // Perhatikan baris ini!
Console.WriteLine($"{angka1} + {angka2} = {hasil}");

Sampai di sini, mungkin timbul pertanyaan dalam benak Anda. Bukannya kita bisa menggunakan nilai balik dengan kata kunci return daripada menggunakan pengubah parameter out untuk mendapatkan hasil dari method Penambahan()?

Benar sekali! Namun dengan menggunakan kata kunci return berarti kita hanya bisa mendapatkan satu nilai saja. Bagaimana jika kita menginginkan sebuah method yang bisa memberi kita lebih dari satu nilai?

Jika Anda ingat materi sebelumnya tentang konversi tipe data, kita menggunakan method Int32.TryParse() untuk melakukan parsing sebuah nilai string ke nilai integer. Method tersebut mempunyai definisi seperti berikut ini.

public static bool TryParse (string s, out int result);

Dari definisi di atas, method ini memiliki nilai balik berupa tipe bool untuk menyatakan proses parsing telah berhasil atau gagal. Selain itu, method ini juga memiliki parameter out untuk menampung hasil parsing berupa nilai int yang selanjutnya bisa kita gunakan.

Hal Yang Perlu Diperhatikan Dari Penggunaan Pengubah Parameter out

Ada satu hal mendasar mengenai parameter out yang perlu kita perhatikan. Jika menggunakan parameter ref mewajibkan kita menginisialisasi sebuah variabel terlebih dahulu sebelum memberikannya sebagai argumen, kita tidak perlu melakukannya ketika menggunakan parameter out.

Justru parameter out ini sebaiknya hanya menerima variabel yang belum diinisialisasi. Apabila kita memberikan sebuah variabel yang telah diinisialisasi sebagai argumen, parameter out akan mengabaikannya dan menganggap bahwa variabel tersebut tidak memiliki nilai apapun.

using System;

namespace PengubahParameter
{
    class Program
    {
        static void Main(string[] args)
        {
            // Deklarasi dan inisialisasi variabel hasil
            int hasil = 0;

            // Berikan variabel hasil dengan nilai 10 sebagai argumen
            NaikkanNilai(10, out hasil);            
        }

        static void NaikkanNilai(int kenaikan, out int hasil)
        {
            // Eror! Parameter out hasil tidak pernah diinisialisasi.
            hasil = hasil + kenaikan;
        }
    }
}

Jika Anda perhatikan kode program di atas, kita mendeklarasikan dan menginisialisasi variabel hasil dengan nilai 0, kemudian kita memberikan variabel tersebut ke method NaikkanNilai() sebagai argumen.

Di dalam blok method NaikkanNilai(), kita mencoba menggunakan parameter hasil dengan asumsi bahwa parameter tersebut telah mendapatkan nilai dari argumennya, yaitu 0, untuk menaikkan nilainya sebesar 10.

Namun, kita malah mendapat protes dari compiler karena kita menggunakan parameter hasil tanpa melakukan inisialisasi terlebih dahulu. Bukannya parameter hasil seharusnya sudah diinisialisasi dengan nilai 0 yang didapat dari argumennya?

Apabila kita menggunakan pengubah parameter out, maka kita hanya bisa menerima sebuah nilai dari parameter tersebut, tidak sebaliknya. Berbeda dengan parameter ref yang bisa menerima sekaligus memberi kita sebuah nilai.

Pengubah Parameter params

Satu lagi pengubah parameter pada method di C# yang bisa kita gunakan adalah params.

Apa kegunaannya? Perhatikan kode program di bawah ini di mana kita memberikan sebuah array sebagai argumen untuk suatu method.

using System;

namespace ParameterParams
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] doubleArray = { 5.2, 8.3, 12.1, 96.4 };
            Console.WriteLine("Nilai rata-rata dari doubleArray: {0}", HitungRataRata(doubleArray));
        }

        static double HitungRataRata(double[] nilai)
        {
            double jumlah = 0;
            if (nilai.Length == 0)
                return jumlah;
            for (int i = 0; i < nilai.Length; i++)
                jumlah += nilai[i];
            return (jumlah / nilai.Length);
        }
    }
}

Method HitungRataRata() di atas akan menghitung rata-rata dari semua nilai elemen pada variabel array doubleArray, sehingga akan menghasilkan keluaran seperti di bawah ini.

Nilai rata-rata dari doubleArray: 30.5

Karena method HitungRataRata() menerima argumen dari tipe double[], tanpa mendeklarasikan sebuah variabel array terlebih dahulu seperti doubleArray, kita akan coba memberikan deret angka dari tipe double, yaitu 5.2, 8.3, 12.1, 96.4 langsung sebagai argumen.

static void Main(string[] args)
{
    Console.WriteLine("Nilai rata-rata dari doubleArray: {0}", HitungRataRata(5.2, 8.3, 12.1, 96.4));
}

Sayangnya usaha kita di atas menghasilkan eror. Sebelumnya, compiler akan mencoba mencari method HitungRataRata() yang bisa menerima empat argumen (disebut dengan method overloading yang bisa Anda pelajari di pemrograman berorientasi objek). Namun karena compiler tidak dapat menemukan method tersebut, kita akan mendapat pesan eror.

Agar kita bisa memberi deret angka seperti di atas sebagai argumen, kita hanya perlu melakukan sedikit modifikasi pada parameter nilai, yaitu dengan menambahkan pengubah parameter params seperti di bawah ini.

static double HitungRataRata(params double[] nilai)

Dengan menambahkan pengubah parameter params seperti di atas, kita bisa memberikan berapapun deret angka sebagai argumen untuk method HitungRataRata().

Kode program di bawah ini menggunakan 6 angka dari tipe double sebagai argumen method HitungRataRata() tanpa menghasilkan eror.

Console.WriteLine("Nilai rata-rata dari doubleArray: {0}", HitungRataRata(5.2, 8.3, 12.1, 96.4, 10.5, 23.5));

Apabila dijalankan, kode program di atas akan menghasilkan keluaran seperti berikut ini.

Nilai rata-rata dari doubleArray: 26

Penutup

Pada materi kali ini kita telah mempelajari beberapa pengubah parameter pada method di C#, seperti ref, out, dan params.

Dengan menggunakan pengubah parameter, kita bisa lebih leluasa menentukan bagaimana sebuah parameter pada suatu method menerima sebuah argumen.

Itu saja materi kita kali ini. Jika Anda merasa kesulitan dalam memahami materi ini, jangan menyerah! Tulis kesulitan atau pertanyaan Anda di kolom komentar, saya akan membantu.

Selamat belajar!

Mendapat Manfaat Dari Tulisan Ini? Bantu Bagikan Ya...
Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp
Tinggalkan Balasan

Close Menu